2013-04-06 5 views
2

Я пытаюсь сделать бесконечный список с помощью Commonsware Endless Adapter (https://github.com/commonsguy/cwac-endless), который по умолчанию отлично работает.Перевернутый бесконечный список

То, что я пытаюсь сделать, - это основное приложение для чата. Новые элементы должны появиться в конце, а история чата должна быть загружена бесконечным адаптером, когда пользователь прокручивается вверх.

Это само по себе не сложно. Если ArrayAdapter содержит данные s.t. новейшие элементы находятся в позиции 0, а затем просто используя android:stackFromBottom в объявлении XML ListView поместит начало списка в конец.

Чтобы убедиться в том, что «нагрузка больше» Inicator расположен в верхней части, я переопределить getItem, getView и т.д., чтобы обеспечить его с обратными позиций (count-1-position).

Моя проблема: Когда EndlessAdapter добавляет новые данные в конце списка, «более нагрузка» индикатор остается видимым, заставляя его бесконечно получать больше данных до тех пор, пока больше не принести. Ожидается, что он загружает одну партию, и пользователю необходимо прокрутить вниз (здесь: вверх), чтобы загрузить дополнительные элементы.

Что мне не хватает?

ответ

1

Лично я бы подумал, что для этого сценария нужно обновить, а не EndlessAdapter.

Это означает, что если вы видите дополнительные строки, но ожидающий просмотр все еще существует, ваш измененный getView() работает неправильно. Появятся дополнительные строки, указывающие, что сам работает notifyDataSetChanged() (иначе эти строки не появятся). Итак, если ожидающий просмотр все еще отображается, то getView() предположительно возвращает ожидающий просмотр (позиция 0, я бы догадался). На самом деле, я понятия не имею, как вы можете получить обратный EndlessAdapter для работы, поскольку первая строка всегда должна быть отложенным видом и всегда должна загружать данные, пока у вас не закончится информация (а в случае чата, это, возможно, никогда не бывает).

Следовательно, опять же, я бы использовал pull-to-refresh, или вам придется переключиться на другую «бесконечную» схему, которая обращает внимание на события прокрутки, а не просто ждать ожидающего просмотра отображаться в качестве триггера для получения большего количества данных.

+0

Спасибо за ваш ответ. Я попробую шаблон «pull to refresh» (с другой меткой, конечно);). Я также попытался «smooothScrolls» после загрузки, чтобы переместить ожидающий взгляд из видимого диапазона, но этот подход также не увенчался успехом. – Patrick

0

Не заботьтесь о notifyDataSetChanged() help. Я реализовал адаптер, чтобы возвращать Integer.MAX_VALUE как количество элементов и особенно вычислять индекс в кеше.

Вот некоторые сниппет:

<ListView 
     android:id="@+id/logContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:stackFromBottom="true" /> 

...... 

    logContainer.setOnScrollListener(new OnScrollListener() { 
     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      if ((logAdapter.getCachedCount() - (Integer.MAX_VALUE - firstVisibleItem)) <= LINES_TO_TRIGGER_PRELOAD && !logAdapter.isPreloading()) { 
       logAdapter.preloadAtBackground(); 
      } 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) {} 
    }); 



class LogAdapter extends BaseAdapter { 

    private ArrayList<String> logList = new ArrayList<String>(); 

    @Override 
    public int getCount() { 
     return Integer.MAX_VALUE; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView logLineView = new TextView(LogViewDialog.this); 
     int idx = logList.size() - (Integer.MAX_VALUE - position); 
     logLineView.setText(logList.get(idx)); 
     return logLineView; 
    } 

    ......... 
Смежные вопросы