在获得ListView
中某一行的数据后,我想要更新这一行。
目前我使用的是notifyDataSetChanged();
,但这会使View
的反应非常慢。还有其他的解决方案吗?
发布于 2010-01-24 00:55:05
一种选择是直接操作ListView
。首先检查更新的行的索引是否在getFirstVisiblePosition()
和getLastVisiblePosition()
之间,这两个索引提供了在屏幕上可见的适配器中的第一个和最后一个位置。然后,您可以使用getChildAt(int index)
获取行View
并更改它。
发布于 2012-04-03 13:45:08
作为Google I/O session期间的Romain Guy explained a while back,在列表视图中仅更新一个视图的最有效方法如下所示(此方法更新整个视图数据):
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
文本的示例):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
在我们信任的代码中。
发布于 2013-05-09 10:31:58
这个更简单的方法很适合我,您只需要知道位置索引就可以获得视图:
// 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);
}
https://stackoverflow.com/questions/2123083
复制相似问题