反向无尽的列表视图

时间:2013-04-06 14:56:34

标签: android commonsware-cwac

我正在尝试使用Commonsware Endless Adapter(https://github.com/commonsguy/cwac-endless)进行无尽的listview,默认情况下工作正常。

我要做的是一个基本的聊天应用程序。 当用户滚动到顶部时,新项目应显示在最后,聊天历史记录应由无限适配器加载。

这本身并不难。如果ArrayAdapter包含数据s.t.最新的项目位于0位置,然后在ListView的XML声明中使用android:stackFromBottom将列表的开头放在最后。

为了确保“加载更多”指示符位于顶部,我会覆盖getItemgetView等,为其提供反转位置(count-1-position)。< / p>

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

我错过了什么?

2 个答案:

答案 0 :(得分:1)

就个人而言,我会考虑针对此方案进行pull-to-refresh,而不是EndlessAdapter

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

因此,再次,我将使用pull-to-refresh,或者您将不得不切换到一个注意滚动事件的不同“无尽”方案,而不是仅仅等待待处理视图显示,作为获取更多数据的触发器。

答案 1 :(得分: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;
    }

    .........