ListView с кэшем AlphaIndexer не очищается - PullRequest
1 голос
/ 14 июля 2011

Итак, у меня есть одно действие со списком в нем, которое динамически обновляется с помощью курсоров.Объект курсора используется повторно, просто переназначая команду запроса для этой переменной, которая возвращает целый новый набор данных.Это отлично работает.Проблема в том, что я расширил SimpleCursorAdapter для работы с AlphaIndexer.Очевидно, когда курсор обновляется или изменяется, он должен очистить индексированный кеш.Это не происходитОсновная причина всего этого заключается в том, чтобы быстрая прокрутка работала на разных переданных курсорах и работала.Прямо сейчас, при использовании разных курсоров, просмотр списка использует индексы из первого просмотра списка с попыткой быстрой прокрутки второго просмотра списка.

class AlphaCursor extends SimpleCursorAdapter implements SectionIndexer {

    AlphabetIndexer alphaIndexer;
    private int list_type;
    public AlphaCursor(Context context, int layout, Cursor c, String[] from, int[] to, int type, String sortBy) {
        super(context, layout, c, from, to);
        // MUST have space in front of alphabet
        int count = c.getCount();
        // this.onContentChanged();doesnt do a thing
        alphaIndexer = new AlphabetIndexer(c, c.getColumnIndex(sortBy), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        list_type = type;

Есть идеи, что может происходить или как очистить этот кеш?Я пробовал onChanged (), а также onContentChanged ().Кто-нибудь видел это или знает какие-либо предложения?

Код используется следующим образом:

    alpha = new AlphaCursor(ClassActivity.this, R.layout.list_item, m_cursor, from, to, TAB_HOME, "name");
    alpha.changeCursor(m_cursor);
mList.setAdapter(alpha);

Имейте в виду, у меня есть 4 "вкладки", которые просто запрашивают курсор и создаютновый AlphaIndexer.При каждом нажатии вкладки альфа-переменная обнуляется.Похоже, что с индексатором есть сцепление представлений.

Спасибо

Ответы [ 3 ]

1 голос
/ 11 марта 2012

Поскольку кажется, что AlphaIndexer становится привязанным к ScrollView при его первом использовании, он игнорирует любые последующие изменения, когда в адаптере устанавливается новое.

Чтобы обойти проблему, как описано в вопросе, я сделал AlphaIndexer членом ListFragment и создал его один раз. При последующих изменениях курсора, используемого в адаптере, я просто назвал alphaIndexer.setCursor (aCursor). Это устранило проблему индекса «устаревших», а также алфавита «смещения» при попытке использовать setFastScrollEnabled () со значением false / true.

Я предполагаю, что это также будет работать с ListActivity.

0 голосов
/ 07 сентября 2011

Вам никогда не придется менять адаптер из-под ListView.Посмотрите, что происходит с вами, вызывайте swapCursor () вместо changeCursor ().

0 голосов
/ 15 июля 2011

Попробуйте вызвать alphaIndexer.setCursor(cursor);

после этого

alphaIndexer = new AlphabetIndexer(c, c.getColumnIndex(sortBy), " ABCDEFGHIJKLMNOPQRSTUVWXYZ");

Метод setCursor устанавливает новый курсор в качестве набора данных и сбрасывает кэшиндексы.

...