Android:是否可以只刷新列表视图中的一个项目?

Android:是否可以只刷新列表视图中的一个项目?,android,listview,Android,Listview,我想知道是否可以在listview中只重新渲染一个元素?我想通过调用notifyDatasetChanged()会重新引发整个列表吗 谢谢,你可以,但是有点复杂。您必须获取列表中第一个可见项的索引,然后使用该索引确定该项在可视项列表中需要更新的位置,然后获取其视图并在那里进行更新 只需调用notifyDatasetChanged()就容易多了。您还可以使用以下方法: myListView.invalidateViews(); 您需要跟踪您的适配器(或自定义适配器,如果您设置了奇特的功能)。更改

我想知道是否可以在listview中只重新渲染一个元素?我想通过调用
notifyDatasetChanged()
会重新引发整个列表吗


谢谢,

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

只需调用
notifyDatasetChanged()

就容易多了。您还可以使用以下方法:

myListView.invalidateViews();

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

请注意,这种方法对库视图的效果也完全相同。

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

像这样:

    View v = listViewItems.getChildAt(position - 
            listViewItems.getFirstVisiblePosition());
    v.setBackgroundColor(Color.GREEN);
我希望这有帮助…

我就是这样做的:

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

对于更新检查列表中的每个元素,如果存在具有给定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
        }
    }
}
private void更新(长id)
{
int c=list.getChildCount();
对于(int i=0;i

它实际上比其他方法更简单,而且在处理ID而不是位置时更好!此外,当你的视图变得不可见和可见时,你必须考虑场景。告诉列表适配器已被修改。我不确定你能不能一个一个地更新一个元素。这里有一个类似的问题:谷歌,要知道这些问题都很老了。对于现代Android(2014+),您只需使用notifyDatasetChanged即可。它的效率令人难以置信,只会重新绘制屏幕上的内容。现在使用现代的“HolderView”模式是非常必要的。所以这一切都不是问题。那么如何获得列表中第一个可见项的索引呢?刷新整个列表并不可取可能有性能方面的原因。您只需在ListView上调用
getFirstVisiblePosition()
@CaseyB你能帮我解决这个问题吗?我正在listview中重命名文件名,但即使调用它也不会刷新。有什么想法吗?问题是如何只刷新一个项目。此解决方案可刷新所有ITME。所以这不是正确的回答。当然它确实有帮助。非常感谢+1:这正是我想要的。+10这真的为我的应用程序实现节省了很多好的,它真的帮助了我标签的想法在我的情况下帮助了我-我从同一个布局文件中膨胀了动态的视图数量,并且不得不以某种方式检查我要更改的视图。它有效,但大部分时间都会延迟重画整个页面。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = super.getView(position, convertView, parent);
    view.setTag(getItemId(position));
    return view;
}
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
        }
    }
}