两个ListView 嵌套数据出现错位,混淆的,图片闪烁问题
2015-10-27 19:26
656 查看
首先,项目里面需要用到2个ListView View嵌套,做成朋友圈那种 可以发送9张图的那种,但是做出来,出现问题,每次发布新消息的时候,一级ListView ,与2级ListView的内容时错位的,研究了2个小时,才考虑出问题之所在,原来是ListView 的adapter 适配 复用机制。
ViewHolder mviewHolder
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.friends_circle_item, null);
mviewHolder = new ViewHolder(convertView);
linewidth=Friend_circle.screenWidth - dip2px(6 + 6 + 50 + 10);
availableTextWidth = (Friend_circle.screenWidth - dip2px(6 + 6 + 50 + 10)) * 6;
convertView.setTag(mviewHolder);
}else{
mviewHolder=(ViewHolder)convertView.getTag();
}
复用机制: 就是将ListView 里面的Item 进行复用。不用每次去加载布局文件 和申明每个控件。 但是复用 会出现 图片混淆问题, 解决办法是 添加TAG 标签区别。
出现BUG的代码
MyGridAdapter girdAdpter 写成了全局 变量,之后就会出现,item里面的复用 有问题;
修改代码 可知,每天listview 都会有一个adapter,,、得到启发,所以该为局部变量。
—————————————————————————————————————————————————————————————————————————————
(1)相关资料:
目的:想实现一种效果,点击gridview或者listview某个item时,希望这个item的图片变化或者内容变化下。
在点击事件中可获得点击的item以及它在gridview、listview中的position,可以通过设置这个item的属性来改变gridview、listview中的数据源,但是如果每次点击都调用gridview.setADapter(xxx)方法的话,数据相当于重新加载了一遍,会刷新一遍,这样就很难达到我们定位所选择的那个子item上了!有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新gridview、listview。
所以,我们可以这样解决这个问题:在点击事件中获得所点击的item并改变了它的背景等其他属性后调用:
SimpleAdapter sa = (SimpleAdapter)gridview.getAdapter();
sa.notifyDataSetChanged();
这样数据刷新而不是整个页面的刷新!
(2)Android开发ListView嵌套GridView,如何更加优化
我在ListView中嵌套GridView,效果实现了,但我在ListView的getView()中是
new GridViewAdapter(``````),也就是说我每一个大的ListView的Item都有去new
一个GridView的适配器,这样对内存不好。可我想通过notifyDataSetChanged()来
改变嵌套的GridView中的数据,一直实现不了。。。求高手解答···
解决:用viewhoder,重用converview,holder中可以保存adapter等信息,不要每次都new
!!!!!
ViewHolder mviewHolder
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.friends_circle_item, null);
mviewHolder = new ViewHolder(convertView);
linewidth=Friend_circle.screenWidth - dip2px(6 + 6 + 50 + 10);
availableTextWidth = (Friend_circle.screenWidth - dip2px(6 + 6 + 50 + 10)) * 6;
convertView.setTag(mviewHolder);
}else{
mviewHolder=(ViewHolder)convertView.getTag();
}
复用机制: 就是将ListView 里面的Item 进行复用。不用每次去加载布局文件 和申明每个控件。 但是复用 会出现 图片混淆问题, 解决办法是 添加TAG 标签区别。
出现BUG的代码
MyGridAdapter girdAdpter 写成了全局 变量,之后就会出现,item里面的复用 有问题;
修改代码 可知,每天listview 都会有一个adapter,,、得到启发,所以该为局部变量。
—————————————————————————————————————————————————————————————————————————————
(1)相关资料:
目的:想实现一种效果,点击gridview或者listview某个item时,希望这个item的图片变化或者内容变化下。
在点击事件中可获得点击的item以及它在gridview、listview中的position,可以通过设置这个item的属性来改变gridview、listview中的数据源,但是如果每次点击都调用gridview.setADapter(xxx)方法的话,数据相当于重新加载了一遍,会刷新一遍,这样就很难达到我们定位所选择的那个子item上了!有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新gridview、listview。
所以,我们可以这样解决这个问题:在点击事件中获得所点击的item并改变了它的背景等其他属性后调用:
SimpleAdapter sa = (SimpleAdapter)gridview.getAdapter();
sa.notifyDataSetChanged();
这样数据刷新而不是整个页面的刷新!
(2)Android开发ListView嵌套GridView,如何更加优化
我在ListView中嵌套GridView,效果实现了,但我在ListView的getView()中是
new GridViewAdapter(``````),也就是说我每一个大的ListView的Item都有去new
一个GridView的适配器,这样对内存不好。可我想通过notifyDataSetChanged()来
改变嵌套的GridView中的数据,一直实现不了。。。求高手解答···
解决:用viewhoder,重用converview,holder中可以保存adapter等信息,不要每次都new
!!!!!
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- mysql中insert与select的嵌套使用方法
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- sql语句中单引号嵌套问题(一定要避免直接嵌套)
- C#实现ListView选中项向上或向下移动的方法
- (X)HTML Strict 下的嵌套规则
- javascript 嵌套的函数(作用域链)
- C# listview添加combobox到单元格的实现代码
- ListView Adapter优化 实例
- Android用ListView显示SDCard文件列表的小例子
- Adapter实现ListView带多选框等状态的自定义控件的注意事项
- JQuery each()嵌套使用小结
- gridview和checkboxlist的嵌套相关应用
- asp.net ListView 数据绑定
- javascript 复杂的嵌套环境中输出单引号和双引号