【问题标题】:A reversed endless listview一个反向的无限列表视图
【发布时间】:2013-04-06 14:56:34
【问题描述】:

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

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

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

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

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

我错过了什么?

【问题讨论】:

    标签: android commonsware-cwac


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。我将尝试“拉动刷新”模式(当然使用不同的标签;))。加载后我也尝试过“smooothScrolls”将挂起的视图移出可见范围,但这种方法也没有成功。
    【解决方案2】:

    不关心 notifyDataSetChanged() 帮助。 我实现了一个适配器来返回 Integer.MAX_VALUE 作为元素的计数,尤其是计算缓存中的索引。

    这是一些sn-p:

        <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;
        }
    
        .........
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2021-03-21
      • 2018-12-26
      • 2011-04-27
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多