1

我正在尝试实现 AlphabetIndexer 来帮助用户滚动浏览我的列表,但是当我运行应用程序时,列表上没有显示任何内容。有人可以告诉我为什么吗?

注意:我没有在适配器的构造函数中实例化 AlphabetIndexer,因为此时没有可用的光标。

以下是相关代码:

在 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();
}

}

4

2 回答 2

3

有时,如果您的列表不足以保证快速滚动,Android 会隐藏快速滚动功能。不确定这是否是您的问题,但可能值得尝试将一堆项目添加到列表中。

于 2012-08-07T22:00:27.943 回答
1

我刚刚在字母索引器和快速滚动器上浪费了几个小时。在我的情况下,列表并不总是足够长以保证快速滚动/字母索引器功能。确切的行为可以在 class 中找到,FastScroller它是AbsListView. 那里有一段代码决定“列表是否很长”

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

MIN_PAGES定义为 4。如果您的列表项计数不是至少 4 倍子计数(可见行)快速滚动条,那么您就有了它,因此不会出现字母索引器。

于 2015-11-11T01:39:30.650 回答