【问题标题】:Android - how to stop ListView.setAdapter(); interrupting scroll view?Android - 如何停止 ListView.setAdapter();打断滚动视图?
【发布时间】:2014-09-28 16:09:04
【问题描述】:

我有一个 ListView 和一个方法 (public ArrayAdapter<String> populateListView(){}) 来更新适配器。我每 500 毫秒打电话给lv.setAdapter(populateListView();。这可行,但如果我向下滚动 ListView,当调用该方法时,它会重置我的视图并自动将我滚动到顶部。因此,如果我的 ListView 下降了 80%,当调用该方法时,我将重置为 0%。

如何在不重置滚动位置的情况下持续填充我的 ListView?

我已经尝试在设置适配器之前调用lv.getScrollY();,然后再调用lv.setScrollY();,但这没有帮助。我也试过打电话给lv.scrollTo(0, scrollY);,但这无济于事。

更新适配器时如何停止重置滚动位置?

【问题讨论】:

  • 每个500ms?您是在实时绘制我们穿越宇宙的旅程吗?
  • 无论如何,当您调用setAdapter(...) 时,列表视图滚动位置会重置。你看过notifyDataSetChanged()吗?此外,setScroll()scrollTo() 方法必须发布到 View => mListView.post(new Runnable() { ... })。将lv.scrollTo(0, scrollY) 调用放在Runnablerun() 方法中。 500ms 非常令人震惊。考虑切换到不那么剧烈的时间单位。
  • @Vikram 很好地考虑到 Android 大约在每个滴答声都会保存系统文件,我需要相当快地更新这些值。

标签: android listview android-listview


【解决方案1】:

尝试更新适配器中的项目并调用 adapter.notifyDataSetChanged() 而不是创建新适配器。

例子:

adapter.replaceItems(yourNewListWithData);
adapter.notifyDataSetChanged();

你必须自己实现 replaceItems 方法。

public void replaceItems(List<? extends E> newItems) {
    entries.clear();
    entries.addAll(newItems);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多