ListView的Item高度不确定,导致最后一条item中ImageView 加载图片时不能完全显示
2016-07-20 23:11
330 查看
聊天界面中,item中有图片和文字或者语音,每次加载之后都要让list view显示最后一条,正常情况下让listview.setselection(listview.getcount()-1)就可以定位到最后一条。正常情况下这样时没有问题的,如果不正常的情况下,比如设置了没有效果呢?
不正常的情况是,我遇到的一种情况。ListView添加的Item内部包含有图片,只显示图片的一部分,另一部分需要手动滑出来...
下面是分析过程:
首先,我注意到我的图片Item由于图片的尺寸不确定,所以ImageView的宽高是wrapcontent。
莫非是因为ListView在计算Item高度的时候,计算错误了?我一度是这么认为的。。。
直到跟着这篇 Android ListView工作原理完全解析,带你从源码的角度彻底理解 博客撸了一遍ListView的源码,
发现ListView建立会有三次Layout,但是在第一次Layout结束就调用了Adapter的getView函数,
并且对加载的Item进行了测量。这么说来,ListView测量Item的高度不可能出错啊。。。
ListView第一次测量时,图片还没有加载到ImageView中去,那么Listview测量出的Item
的高度自然就是错的了。不过,Android肯定不会留这么大一个bug在系统中的,所以ListView
其实会多次测量Item的高度,不过由于setSelection()被调用的时候,ImageView中没有图片,
item的高度是错误的,而当测量出正确的高度时并没有再次调用setSelection(),所以就导致
了最后一个Item显示不全的bug。
那么解决的办法也就简单了,在adapter数据改变之后先调用一次setSelection(ListView.FOCUS_DOWN)
(这次调用是必须的,这次调用决定了系统加载哪一页的数据),然后用handler.postDelay延迟500ms
再调用一次setSelection()即可。
不正常的情况是,我遇到的一种情况。ListView添加的Item内部包含有图片,只显示图片的一部分,另一部分需要手动滑出来...
下面是分析过程:
首先,我注意到我的图片Item由于图片的尺寸不确定,所以ImageView的宽高是wrapcontent。
莫非是因为ListView在计算Item高度的时候,计算错误了?我一度是这么认为的。。。
直到跟着这篇 Android ListView工作原理完全解析,带你从源码的角度彻底理解 博客撸了一遍ListView的源码,
发现ListView建立会有三次Layout,但是在第一次Layout结束就调用了Adapter的getView函数,
并且对加载的Item进行了测量。这么说来,ListView测量Item的高度不可能出错啊。。。
ListView第一次测量时,图片还没有加载到ImageView中去,那么Listview测量出的Item
的高度自然就是错的了。不过,Android肯定不会留这么大一个bug在系统中的,所以ListView
其实会多次测量Item的高度,不过由于setSelection()被调用的时候,ImageView中没有图片,
item的高度是错误的,而当测量出正确的高度时并没有再次调用setSelection(),所以就导致
了最后一个Item显示不全的bug。
那么解决的办法也就简单了,在adapter数据改变之后先调用一次setSelection(ListView.FOCUS_DOWN)
(这次调用是必须的,这次调用决定了系统加载哪一页的数据),然后用handler.postDelay延迟500ms
再调用一次setSelection()即可。
相关文章推荐
- Mac OSX 配置rz、sz 远程上传、下载文件
- JavaScript:DOM
- Android 仿腾讯QQ 的 ListView滑动删除
- vim 经典配色 molokai.vim 配色安装
- GitHub和SourceTree入门教程
- 【面试编程题】7-剑指offer之高质量的代码
- Python 学习之路-基本的概念(三)
- oxs proxychinas4 不起作用----关闭SIP
- IIS服务器 & PHP 测试问题
- 关于ffmpeg的例子muxing.c
- oracle常用函数
- gridview多选单选的实现
- 细剖最短路【闲谈,权当是饭后杂文】
- idea 14.0破解
- C语言中体现面向对象的地方
- 《玩转Bootstrap(基础)》笔记
- Fresco内存机制(Ashmem匿名共享内存)
- 《转》【笔记3】获取csi文件,并用MATLAB处理
- python mvc框架django搭建项目
- JTree的用法实践