我正在尝试实现AlphabetIndexer来帮助用户滚动浏览我的列表,但是当我运行应用程序时,列表中没有显示任何内容。有人可以告诉我为什么吗?
注意:我没有在Adapter的构造函数中实例化AlphabetIndexer,因为在那时,没有Cursor可用。
以下是相关代码:
在Activity的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查询Cursor的方法。 AsyncQueryHandler看起来像这样:
private final class MyQueryHandler extends AsyncQueryHandler {
public MyQueryHandler(Context context) {
super(context.getContentResolver());
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (!isFinishing()) {
if (mAdapter != null) {
mAdapter.changeCursor(cursor);
}
}
else {
cursor.close();
}
}
}
最后,我的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 :(得分:3)
如果您的列表不够长,无法保证快速滚动,Android有时会隐藏快速滚动功能。不确定这是不是你的问题,但是可能值得尝试将一堆项目添加到列表中。
答案 1 :(得分:1)
我刚刚在字母索引器和快速滚动器上丢失了几个小时。在我的情况下,列表并不总是足以让您快速滚动快速滚动/字母索引器功能。确切的行为可以在FastScroller
类中找到,它是AbsListView
的帮助类。那里有一段代码决定“列表是否很长”
final boolean longList = childCount > 0 && itemCount / childCount >= MIN_PAGES;
MIN_PAGES
定义为值为4.如果您的列表项计数不是至少4倍,则子数(可见行)快速滚动,因此不会出现字母索引器。