ListView GridView 自定义ViewGroup的单个item 刷新 和 单个item中的局部元素刷新

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 可以

 
 





你可能感兴趣的:(ListView GridView 自定义ViewGroup的单个item 刷新 和 单个item中的局部元素刷新)