【问题标题】:Listview: smooth scroll and row update at the same timeListview:同时平滑滚动和行更新
【发布时间】:2015-06-23 17:18:00
【问题描述】:

我基本上必须同时平滑滚动列表视图并更新一行。 我现在用一种简单的方法来做:

mListViewWeeks.post(new Runnable() {
            @Override
            public void run() {
                // update the row concerned
                updateItemAtPosition(rowIndex);

                int duration = 200;
                mListView.smoothScrollToPositionFromTop(rowIndex, 0, duration);
            }
});

使用 updateItemAtPosition() 函数:

private void updateItemAtPosition(int position) {
    int visiblePosition = mListView.getFirstVisiblePosition();
    View view = mListView.getChildAt(position - visiblePosition);
    mListView.getAdapter().getView(position, view, mListView);
}

它在合理的滚动速度下运行良好,但是当速度更快时(以高速率调用上面的第一个块)它可能会有点滞后。在平滑滚动的同时,我可以做些什么来改进更新行?

【问题讨论】:

  • 对于更新列表视图,您需要实现视图模式javacodegeeks.com/2013/09/…,您的列表视图会更高效且可平滑滚动。
  • 我使用这种模式,当列表项在屏幕上可见时,这种模式会调用 getView()。现在如何更新已经在屏幕上可见的项目?

标签: android listview scroll


【解决方案1】:

你不应该像这样直接访问 iew。相反,您应该更新列表中显示的模型对象并在适配器中调用 notifyDataSetChanged()

【讨论】:

  • 没错,我一开始也是这么想的。 notifyDataSetChanged() 使 UI 更新最差,而 getView() 与之相比看起来不错。听起来很骇人听闻,但这是我迄今为止最好的!
  • 如果在调用 smoothScrollToPositionFromTop() 之前更新模型对象;您不需要调用 notifyDataSetChanged()。 getView(..) 将被调用并根据您的模型对象自动更新您的视图。
【解决方案2】:

好吧,我真的来晚了。这似乎是引入 RecyclerView 的原因之一。从现在开始我会尝试使用这个组件。

layoutManager.scrollToPosition(position);的组合

adapter.notifyItemChanged(position); 完成这项工作。一切顺利!!

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2017-03-12
    • 2014-01-12
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多