Невозможно заставить AlphabetIndexer работать - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь реализовать AlphabetIndexer, чтобы помочь пользователям прокручивать мой список, но при запуске приложения в списке ничего не появляется. Может кто-нибудь сказать, пожалуйста, почему?

Примечание. Я не создаю экземпляр 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 выглядит так:

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

}

Ответы [ 2 ]

3 голосов
/ 08 августа 2012

Иногда Android скрывает функцию быстрой прокрутки, если ваш список недостаточно длинный, чтобы обеспечить быструю прокрутку. Не уверен, что это ваша проблема, но, возможно, стоит попытаться добавить несколько пунктов в список.

1 голос
/ 11 ноября 2015

Я только что потерял пару часов на алфавитном указателе и быстрой прокрутке. В моем случае список не всегда был достаточно длинным, чтобы использовать функцию быстрой прокрутки / алфавитного индексатора. Точное поведение можно найти в классе FastScroller, который является вспомогательным классом для AbsListView. Там есть фрагмент кода, который решает, является ли «список длинным»

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

MIN_PAGES определяется значением 4. Если у вас есть элемент списка, по крайней мере, в 4 раза быстрее прокрутка по количеству дочерних элементов (видимых строк) и, следовательно, алфавитный индексатор не появится.

...