ListView,GridView,RecyclerView滑动错位的终极解决办法
来源:互联网 发布:淘宝双11不发货 编辑:程序博客网 时间:2024/06/05 02:24
直接讲重点!
假如你的item布局里面包含但不限于这些东西:textView,ImageView,CheckBox,Button...
你一定遇到过滑动列表时item里面的控件错位,该出现的地方不出现,不该出现的地方反而蹦出来的情况。
我也在网上看过很多解决办法,很多说给什么控件设置一个tag呀之类的,看着我都觉得麻烦,其实解决滑动错位并不需要设置什么tag,就一个if-else就能解决。
下面正片!
问题的所在就是你的adapter里面,这里我们直接看一个最简单ListView 的Adapter,其他的GridView,RecyclerView原理也是一模一样,就不多赘述。
直接看adapter里面的getView方法:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_layout, parent, false); viewHolder = new ViewHolder(); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.image = (ImageView) convertView.findViewById(R.id.image); viewHolder.check = (CheckBox) convertView.findViewById(R.id.check); viewHolder.button = (Button) convertView.findViewById(R.id.button); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } ListViewBean listViewBean = mList.get(position); viewHolder.title.setText(listViewBean.getTitle()); //绑定数据 //重点!!! //滑动导致item里面的控件错位 //第一种情况 // 数据绑定之后滑动错位 //很多情况我们会写如下代码 //根据image的路径是否为空来给ImageView赋值 //你可能认为逻辑没错,如果iamgePath有路径那么才给图片赋值 //但是运行之后,全TM乱了 if (!"".equals(listViewBean.getImagePath())) { viewHolder.image.setImageURI(Uri.parse(listViewBean.getImagePath())); } //解决方案:只需要再加上一个else就够了 //为什么加上一个else就不会错位了? //我也懒得给你们讲缓存什么的(我也不会讲) //通俗易懂的来说: // 当进入listViewBean.getImagePath()有路径的时候, // 程序进了if里面,里面明确规定了我要把路径赋值给imageView,程序就照着我规定的做 // 但是,如果listViewBean.getImagePath()是空的时候,程序不会进入if, // 不仅没进if,而且你也没在任何地方给他规定路径是空的时候他应该做什么 // 那他就只能胡乱给你填数据咯 if (!"".equals(listViewBean.getImagePath())) { viewHolder.image.setImageURI(Uri.parse(listViewBean.getImagePath())); } else { //所以当路径为空时,也必须规定该控件应该怎么做 viewHolder.image.setImageResource(R.mipmap.ic_launcher); } // 第二种情况: //设置某一控件显示或者隐藏 //下面的代码,我定义了一个boolean类型的属性,用来判断我的checkBox是否显示 //单当你运行之后就会发现,checkBox错位了 if (listViewBean.isDisPlayCheck()) { viewHolder.check.setVisibility(View.VISIBLE); } //解决方案:同样也只需要加上一个else //代码修改如下,button也同样 if (listViewBean.isDisPlayCheck()) { viewHolder.check.setVisibility(View.VISIBLE); } else { viewHolder.check.setVisibility(View.GONE); } if (listViewBean.isDisPlayButton()) { viewHolder.button.setVisibility(View.VISIBLE); } else { viewHolder.button.setVisibility(View.GONE); } return convertView; }
总结:只要是在ViewHolder里面声明了的控件,要么不赋值,要么在所有分支都赋值,有if,就一定要有else,要让控件无论进入哪一个分支都明白自己应该做什么事
阅读全文
2 0
- ListView,GridView,RecyclerView滑动错位的终极解决办法
- ListView或GridView快速滑动View错位解决办法
- listview滑动时数据错位解决办法
- Android ListView,GridView,RecyclerView图片加载错位闪动问题解决办法
- recyclerview嵌套Gridview的图片错位或显示不全解决办法实验
- Android ListView(GridView) 滑动 拖动 背景为黑色的解决办法
- 关于ListView的滑动错位问题
- 使用RecyclerView实现滑动添加、滑动删除,以及瀑布流、ListView、GridView的转换
- 使用RecyclerView实现ListView,GridView的效果(上下,左右滑动),拖拽与滑动删除
- Android ListView GridView 错位
- ListView、GridView、RecyclerView的使用
- ListView GridView图片错位处理
- RecyclerView 与ListView、GridView的区别
- RecyclerView实现ListView和GridView的效果
- 不可滑动ListView、GridView
- Listview错位的问题
- listview的错位原理
- ListView GridView 适配器(终极模板)
- Linux系统中一些实用的快捷键
- mysql优化
- 【Android】隐藏底部虚拟按键
- 亚泰史诗-通讯协议初步分析
- 页目录和页表结构---醍醐灌顶
- ListView,GridView,RecyclerView滑动错位的终极解决办法
- 【H5开发】ubuntu(virtualBox)上通过桥接方式配置ip供手机端访问
- Linux下关闭终端之后继续运行相应的进程
- sklearn数据预处理类库学习
- 【转】hibernate中使用Criteria 的使用详解
- 防止表单重复提交的几种方法总结
- 人体五行图
- 编程字体选择
- for循环—V字形、逢10换行、遍历2维数组、嵌套元素、点击生成一组新闻