2

我正在尝试使用 Commonsware Endless Adapter ( https://github.com/commonsguy/cwac-endless ) 做一个无尽的列表视图,默认情况下工作正常。

我想做的是一个基本的聊天应用程序。新项目应该出现在最后,并且当用户滚动到顶部时,无限适配器应该可以加载聊天历史记录。

这本身并不难做到。如果 ArrayAdapter 包含位于位置 0 的最新数据项,则只需android:stackFromBottom在 ListView 的 XML 声明中使用会将列表的开头放在末尾。

为确保“加载更多”指示符位于顶部,我覆盖了getItemgetView,为它提供了相反的位置 ( count-1-position)。

我的问题:当 EndlessAdapter 在列表末尾添加新数据时,“加载更多”指示器仍然可见,导致它无休止地获取更多数据,直到没有更多数据可供获取。预计它会加载一批,然后用户需要向下滚动(此处:向上)以加载更多元素。

我错过了什么?

4

2 回答 2

1

就个人而言,我会考虑在这种情况下使用下拉刷新,而不是EndlessAdapter.

话虽如此,如果您看到额外的行出现,但挂起的视图仍然存在,那么您的修改getView()无法正常工作。出现的其他行将表明其notifyDataSetChanged()本身正在运行(否则,这些行将不会显示)。所以,如果挂起的视图仍然显示,那么getView()大概是返回挂起的视图(位置 0,我猜)。事实上,我不知道如何让反向EndlessAdapter工作,因为第一行应该始终是挂起的视图,并且应该始终加载数据,直到您用完数据(并且,在聊天的情况下,这是可能永远不会这样)。

因此,我再次使用下拉刷新,否则您将不得不切换到关注滚动事件的不同“无尽”方案,而不是仅仅等待显示挂起的视图,如获取更多数据的触发器。

于 2013-04-06T15:06:21.330 回答
0

不关心 notifyDataSetChanged() 帮助。我实现了一个适配器来返回 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;
    }

    .........
于 2014-12-01T18:30:16.260 回答