2011-10-10 5 views
1

사용자가 내 목록을 스크롤하는 데 도움이되는 AlphabetIndexer를 구현하려고하지만 앱을 실행할 때 목록에 아무 것도 나타나지 않습니다. 누군가 제발 말해 줄래?AlphabetIndexer를 만들 수 없습니다.

참고 : 그 시점에서 사용할 수있는 커서가 없기 때문에 Adapter 생성자에서 AlphabetIndexer를 인스턴스화하지 않습니다.

가 여기에 관련 코드입니다 : 활동의에서 onCreate에서

() 메소드 :

mList = (ListView)findViewById(R.id.mylist); 
mList.setOnItemClickListener(this); 
mList.setFastScrollEnabled(true); 
mAdapter = new MyAdapter(MyActivity.this, R.layout.layout_list_row, null, new String[] {MyColumns.NAME}, new int[] {R.id.itemname}); 
mList.setAdapter(mAdapter); 
mList.setFastScrollEnabled(true); 
doQuery(); 

doQuery()는 AsyncQueryHandler를 사용하여 커서를 쿼리하는 방법입니다. AsyncQueryHandler는 다음과 같습니다.

마지막으로 내 SimpleCursorAdapter입니다. 나는 불필요한 부분을 촬영했습니다 :

public class MyAdapter extends SimpleCursorAdapter implements View.OnClickListener { 

    private Cursor mCursor; 
    AlphabetIndexer alphaIndexer; 


public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
} 

public int getPositionForSection(int section) { 
    return alphaIndexer.getPositionForSection(section); 
} 

public int getSectionForPosition(int position) { 
    return alphaIndexer.getSectionForPosition(position); 
} 

public Object[] getSections() { 
    return alphaIndexer.getSections(); 
} 

public void onClick(View v) { 
    // ... 
}  

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    // ... 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // ... 
} 

@Override 
public void changeCursor(Cursor cursor) { 
    super.changeCursor(cursor); 

    if (MyActivity.this.mCursor != null) { 
     stopManagingCursor(MyActivity.this.mCursor); 
     MyActivity.this.mCursor.close(); 
     MyActivity.this.mCursor = null; 
     mCursor = null; 
    } 
    MyActivity.this.mCursor = cursor; 
    startManagingCursor(MyActivity.this.mCursor); 
    mCursor = cursor; 
    alphaIndexer = new AlphabetIndexer(mCursor, mCursor.getColumnIndex(MyColumns.NAME), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
    alphaIndexer.setCursor(mCursor); 
} 

@Override 
public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 
    return doQuery(); 
} 

}

+0

나는 여기에 비슷한 것을하고있다. http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

답변

3

목록이 충분히 빠르게 스크롤을 보장하지 않는 경우 가끔 안드로이드가 빠르게 스크롤 기능을 숨 깁니다. 그것이 당신의 문제인지 확실하지 않지만 목록에 많은 항목을 추가하는 것이 가치가있을 수 있습니다.

1

저는 알파벳 인덱서와 빠른 스크롤러에서 몇 시간을 잃었습니다. 필자의 경우 목록은 빠른 스크롤/알파벳 인덱서 기능을 사용하기에 충분히 길지 않았습니다. 정확한 동작은 AbsListView의 도우미 클래스 인 클래스 FastScroller에서 찾을 수 있습니다.

final boolean longList = childCount > 0 && itemCount/childCount >= MIN_PAGES; 

MIN_PAGES이있다 4. 목록 항목 수가 적어도 (아이의 수를 4 배하지 않은 경우 당신이 그것을 가지고의 값으로 정의된다 "목록이 긴"만일 결정이 코드 조각이있다 표시 줄) 빠른 스크롤러와 따라서 알파벳 인덱서가 나타나지 않습니다.