Fal*_*rri 40 android listview view redraw android-arrayadapter
是否可以重绘一行中的一行ListView?我有一个ListView行是LinearLayouts.我听一个偏好改变,有时候我需要改变一行View内的LinearLayout一个.有没有办法让它重新绘制该行而不调用listview.notifyDatasetChanged()?
我试过在视图(内部)上调用view.invalidate(),LinearLayout但它没有重绘行.
Gri*_*nRL 106
正如Romain Guy 在Google I/O会话期间解释的那样,仅在列表视图中更新一个视图的最有效方式如下(此更新整个数据):View
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;
}
Run Code Online (Sandbox Code Playgroud)
假设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");
Run Code Online (Sandbox Code Playgroud)
在我们信任的代码中.
这view.invalidate()对我不起作用.但这就像一个魅力:
你正在更新行中的位置" position".该if避免怪异的东西重绘,如文本跳舞,当你在更新行不在屏幕上.
if (position >= listView.getFirstVisiblePosition()
&& position <= listView.getLastVisiblePosition()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
listView.invalidateViews();
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33704 次 |
| 最近记录: |