1、概述
之前在操作listView列表的时候一般都是数据源改了然后 adapter.notifyDataSetChanged(); 一次就不管了
且不说效率问题 当有图片的时候,这个闪一下用户体验就不好了。
很多时候需要的不是刷一屏的数据,只要刷指定index的item的内容就可以了,而且在有网络图片的item往往不想刷图片。我用的是imageLoader 刷item 图片位置会闪一下
2、listView gridView的单个item的刷新
参考:http://m.blog.csdn.net/blog/jdsjlzx/44161443
http://blog.csdn.net/wu_shu_jun/article/details/7794576
private void updateSingleRow(ListView listView, long id) {
if (listView != null) {
int start = listView.getFirstVisiblePosition();
for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)
if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {
View view = listView.getChildAt(i - start);
getView(i, view, listView);
break;
}
}
}
注:该方法是在自己的adapter 内的方法,前几句是对id是否可见的判断
其中起刷新作用的是:adapter的getView函数
public View getView(int position, View convertView, ViewGroup parent)
3、listView的item里的局部元素刷新
简单的说就是取出上面
View view = listView.getChildAt(i - start);
ViewHolder holder = (ViewHolder) view.getTag();
然后去对应的设置holder里元素的内容 就达到了 局部更新的效果
4、自定义的ViewGroup 要刷新局部的item
可以结合setTag和findViewWithTag 使用 也可以一个一个找
public final View findViewWithTag(Object tag) {
5、项目中使用
比如focus 在某一项 然后进去做了一些操作,中转了很多界面,在完成时发出一个信号(用eventbus 或者oot 或者广播) 当指定界面收到的时候更新当前的item
GridView ListView中可以这么操作:
View view = resultGridView.getSelectedView(); VideoSearchEntity entity = resultVideoEntities.get(resultGridView.getSelectedItemPosition()); if (view != null){
//业务逻辑
}
}
如果是ViewPager的嵌套操作方式:
View view = (View) mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem());
Adapter 的 调用getView 可以