Android 中ListView和GridView赋值错位
时间:2019-04-07
本文章向大家介绍Android 中ListView和GridView赋值错位,主要包括Android 中ListView和GridView赋值错位使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ListView和GridView多次调用getView的bug,导致赋值错位
最近总遇到写GridView适配器赋值时,最后一两个需定义其他图片时,赋图错误,原因就是适配器的getView多次调用,导致数据赋值错误,上网搜索终于找到解决方案,以此记录下。
一.ListView
1.原因
因为listView一般用的是wrap_content,高度不确定,导致系统需要不断地测量,也就多次调用onMeasure方法,所以就多次调用getView。
2.解决
很简单,把宽高写死即可(明确给个数字或者match_parent)
二.GridView
1.原因
不管高度和宽度写死与否都会多次调用getView,原因有待继续探索,。。。。
2.解决
无法阻止多次调用getView,只能在onMeasure调用getView的时候不要去对convertView做赋值的操作,只有当onLayout的时候再对ConvertView进行操作。
1).自定义GridView:
MyGridView.java public class MyGridView extends GridView { public boolean isOnMeasure; public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { isOnMeasure = true; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { isOnMeasure = false; super.onLayout(changed, l, t, r, b); } }
2).getView中对ConvertView的处理
@Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("xcqw getView 1***position"+position); ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item, parent, false); holder = new ViewHolder(); holder.tvContent = (TextView) convertView.findViewById(R.id.tv_content); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if(((MyGridView) parent).isOnMeasure){ //如果是onMeasure调用的就立即返回 return convertView; } System.out.println("xcqw getView 2***position"+position); String content = contentList.get(position); holder.tvContent.setText(content); //如果不是onMeasure调用的就可以正常操作了 //赋值操作 return convertView; }
这样就ok了。
如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- Python爬虫之豆瓣音乐及糗事百科
- oracle、mysql 分页查询比较
- Linux乱码问题解决方案
- JDBC为什么要使用PreparedStatement而不是Statement
- tcpdump捕捉样例
- Log4j详细使用教程
- Android系统线控和歌曲信息屏显的那点事
- 利用Spring中同名Bean相互覆盖的特性,定制平台的类内容。
- 关于java传参
- 浅析ButterKnife
- SQL Server常用语句
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- ElasticSearch 基本的查询命令+集成 SpringBoot
- 数据库能力测试:SQL 语句改错
- IDEA 导入并运行 Eclipse 的 JavaWeb 项目
- 使用思科模拟器 Cisco Packet Tracer 模拟交换机基本配置
- IDEA 连接 SQL Sever
- Ms SQL Server 如何导入数据库
- 移动直播连麦PK快速调试
- Python:使用爬虫获取中国最好的大学排名数据(爬虫入门)
- Python:酒鬼漫步
- apache-commons-dbutils + Druid + JDBC 简单实现 CRUD
- Python:将一个 csv 文件转为 json 文件存储到磁盘
- TKE上搭建集群Dashboard
- FFmpeg+OpenSLES 实现音频播放
- 使用 JSP+Servlet 模仿京东页面实现购物车功能
- Python 绘制科赫雪花的简单实现