【问题标题】:Android: Is it possible to refresh just one item in a listview? [duplicate]Android:是否可以仅刷新列表视图中的一项? [复制]
【发布时间】:2010-06-01 21:12:52
【问题描述】:

我想知道是否可以只重新呈现列表视图中的一个元素?我假设通过调用notifyDatasetChanged() 会重新呈现整个列表?

谢谢,

【问题讨论】:

  • 确实,notify... 告诉列表适配器已被修改。我不确定您是否可以逐个更新元素。
  • 这是一个类似的 SO 问题:stackoverflow.com/questions/3724874/…
  • Google 员工,请注意这些问题非常古老。对于现代 Android (2014+),您只需使用 notifyDatasetChanged。它非常高效,只重绘屏幕上的内容。如今,使用现代的“HolderView”模式至关重要。所以这一切都不是问题。

标签: android listview


【解决方案1】:

您不能渲染(刷新)单行,但是您可以通过调用 yourListView.getChildAt(int VisiblePosition); 直接获取请求的视图并对其进行更改,其中 visiblePostion 是 ListView 中的位置减去 yourListView.getFirstVisiblePosition()

像这样:

    View v = listViewItems.getChildAt(position - 
            listViewItems.getFirstVisiblePosition());
    v.setBackgroundColor(Color.GREEN);

我希望这会有所帮助...

【讨论】:

  • 确实有帮助..非常感谢
  • +1:这正是我想要的。
  • +10 这真的为我的应用实施节省了很多
  • 很好,对我很有帮助
【解决方案2】:

可以,但是有点复杂。您必须获取列表中第一个可见项的索引,然后使用它来确定需要更新的项在可视项列表中的位置有多远,然后获取其视图并在那里进行更新。

拨打notifyDatasetChanged()更容易。

【讨论】:

  • 你如何获得列表中第一个可见项目的索引?为什么不推荐刷新整个列表可能有性能原因
  • 你只需要在 ListView 上调用getFirstVisiblePosition()developer.android.com/reference/android/widget/…
  • @CaseyB 你能帮我解决这个问题吗stackoverflow.com/questions/18312539/…
  • 我正在重命名列表视图中的文件名,但即使使用该调用它也不会刷新。有什么想法吗?
  • 问题是如何只刷新一项。此解决方案使所有项目刷新。所以这不是正确的反应。
【解决方案3】:

你也可以使用这个:

myListView.invalidateViews();

【讨论】:

  • 它可以工作,但大多数时候会延迟重绘所有页面。
【解决方案4】:
dataAdapter.remove(dataAdapter.getItem(clickedpos));

dataAdapter.insert(t.getText().toString(), clickedpos);

【讨论】:

    【解决方案5】:

    我就是这样做的:

    您的项目(行)必须具有唯一的 ID,以便您以后可以更新它们。当列表从适配器获取视图时,设置每个视图的标记。 (如果其他地方使用了默认标签,也可以使用key标签)

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View view = super.getView(position, convertView, parent);
        view.setTag(getItemId(position));
        return view;
    }
    

    对于更新检查列表的每个元素,如果具有给定 id 的视图在那里它是可见的并且必须对其执行更新。

    private void update(long id)
    {
    
        int c = list.getChildCount();
        for (int i = 0; i < c; i++)
        {
            View view = list.getChildAt(i);
            if ((Long)view.getTag() == id)
            {
                // update view
            }
        }
    }
    

    当您处理 ids 而不是位置时,它实际上比其他方法更容易并且更好!当您的视图再次变得不可见和可见时,您还必须考虑场景。

    【讨论】:

    • 标签的想法在我的案例中帮助了我——我从同一个布局文件中获得了动态数量的视图,并且不得不以某种方式检查我要更改哪一个。
    【解决方案6】:

    您需要跟踪您的适配器(或自定义适配器,如果您设置了花哨的功能)。当您更改项目的数据时,只需在适配器中更改您感兴趣的字段。 然后调用 notifyDatasetChanged ,更改将反映在您的列表视图中。

    请注意,此方法同样适用于画廊视图。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2012-04-10
      • 1970-01-01
      • 2011-08-31
      • 2011-05-04
      • 2014-12-14
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多