首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓ListView刷新单行

安卓ListView刷新单行
EN

Stack Overflow用户
提问于 2010-01-23 20:10:23
回答 7查看 62.4K关注 0票数 78

在获得ListView中某一行的数据后,我想要更新这一行。

目前我使用的是notifyDataSetChanged();,但这会使View的反应非常慢。还有其他的解决方案吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-24 00:55:05

一种选择是直接操作ListView。首先检查更新的行的索引是否在getFirstVisiblePosition()getLastVisiblePosition()之间,这两个索引提供了在屏幕上可见的适配器中的第一个和最后一个位置。然后,您可以使用getChildAt(int index)获取行View并更改它。

票数 30
EN

Stack Overflow用户

发布于 2012-04-03 13:45:08

作为Google I/O session期间的Romain Guy explained a while back,在列表视图中仅更新一个视图的最有效方法如下所示(此方法更新整个视图数据):

代码语言:javascript
复制
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
    if(target==list.getItemAtPosition(i)){
        View view = list.getChildAt(i-start);
        list.getAdapter().getView(i, view, list);
        break;
    }

假设target是适配器的一项。

这段代码检索ListView,然后浏览当前显示的视图,将您正在查找的target项与每个显示的视图项进行比较,如果您的目标是其中之一,则获取封闭视图并在该视图上执行适配器getView以刷新显示。

顺便说一句,invalidate不会像一些人预期的那样工作,也不会像getView那样刷新视图,notifyDataSetChanged将重新构建整个列表,并最终为每个显示的项目调用getview,而invalidateViews也会影响一大堆。

最后一件事,如果一个人只需要改变行视图的一个子视图,而不是像getView那样改变整个行,那么他也可以获得额外的性能。在这种情况下,以下代码可以替换list.getAdapter().getView(i, view, list); (更改TextView文本的示例):

代码语言:javascript
复制
((TextView)view.findViewById(R.id.myid)).setText("some new text");

在我们信任的代码中。

票数 90
EN

Stack Overflow用户

发布于 2013-05-09 10:31:58

这个更简单的方法很适合我,您只需要知道位置索引就可以获得视图:

代码语言:javascript
复制
// mListView is an instance variable

private void updateItemAtPosition(int position) {
    int visiblePosition = mListView.getFirstVisiblePosition();
    View view = mListView.getChildAt(position - visiblePosition);
    mListView.getAdapter().getView(position, view, mListView);
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2123083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档