由于之前写Scroller应用:ListView滑动删除遇到Item视图错位问题,观察发现第1item位置改变后,第1+10的item布局也跟着改变。假设使用ScrollView+ListView,把ListView的高度測量出来然后再滑动就不会出现错位问题,继续查看之所以间隔10,我屏幕上显示10条数据,这个就涉及到getCount()和getChildCount()问题。进一步追踪发现应该是ListView视图缓存的问题,事实上这个问题跟数据是一样的。只是我们在Adapter的getView中依据不同的position设置不同的数据,这个动作是实时改变的。getChildCount()返回的是内存中的item数目,getCount()返回的是实际的数据数目。ListView中实际的item布局也就是getChildCount()的值,假设採用測量ListView设置其高度的话,那getChildCount()等于getCount()。在ListView中有这么一段代码

	    // Pull all children into the RecycleBin.
// These views will be reused if possible
final int firstPosition = mFirstPosition;
final RecycleBin recycleBin = mRecycler; // reset the focus restoration
View focusLayoutRestoreDirectChild = null; // Don't put header or footer views into the Recycler. Those are
// already cached in mHeaderViews;
if (dataChanged) {
for (int i = 0; i < childCount; i++) {
recycleBin.addScrapView(getChildAt(i), firstPosition+i);
}
} else {
recycleBin.fillActiveViews(childCount, firstPosition);
}

firstPosition是第一个可见的item的位置,recycleBin.addScrapView(getChildAt(i), firstPosition+i);缓存隐藏item的时候。都是使用getChildCount()内的现有的View视图,所以解决错位问题必须採用位置的标记来处理,并且标记也不能在自己定义的item中进行,必须在外部比如自己定义ListView中记录。

Scroller应用:ListView滑动删除中採用的是规避的方式,滑动就关闭之前打开的item,看了QQ消息列表也是滑动的话就隐藏删除button,我不知道是否规避这个问题,由于ListView内存的item数据一般大于屏幕可见的item数据,所以即使屏幕大也看不到。

ListView视图缓存错位问题的更多相关文章

  1. 探究ListView 的缓存机制

    概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...

  2. MVC缓存03,扩展方法实现视图缓存

    关于缓存,先前尝试了: ● 在"MVC缓存01,使用控制器缓存或数据层缓存"中,分别在控制器和Data Access Layer实现了缓存 ● 在"MVC缓存02,使用数 ...

  3. 填一个laravel视图缓存没有及时更新的坑

    1.此坑背景 laravel在渲染blade模板后,会将渲染好的结果存到storage/framework/views(默认路径,也可在配置中修改的)中,以便下次使用.但我最近总是发现修改了blade ...

  4. django视图缓存的实现

    django视图缓存的实现 1,安装 pip install django-redis setting.py CACHES = { "default":{ "BACKEN ...

  5. Android学习——ListView的缓存机制

    在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...

  6. phalcon之视图缓存

    phalcon官方站点上的视图缓存用法根本就是不通的 现提供一种行的通的方法例如以下: public function testAction() { if( $this->view->ge ...

  7. Android笔记(二十五) ListView的缓存机制与BaseAdapter

    之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...

  8. ListView 中图片错位的问题是如何产生的?

    图片错位问题的本质源于我们的 listview 使用了缓存 convertView,假设一种场景,一个 listview 一屏显示九个item,那么在拉出第十个 item 的时候,事实上该 item ...

  9. Asp.Net Core 2.1+的视图缓存(响应缓存)

    响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持. 此功能将支持ASP.NET 核心 2.1 版本. 在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保 ...

随机推荐

  1. 开启CURL扩展,让服务器支持PHP curl函数(远程采集)

    关于开启Curl的方法模板天下小编在此给大家简单说一下 curl().file_get_contents().snoopy.class.php这三个远程页面抓取或采集中用到的工具,默迹还是侵向于用sn ...

  2. linux 性能分析常规逻辑和手段总结

    一. 追查cpu占用较高的进程(线程)  1 . 如何查找出当前系统中占用cpu或者内存最高的进程? ps aux |sort -rn -k 3 |head -n3 查找出当前系统中cpu资源占用前三 ...

  3. CSS margin 属性

    设置外边距的最简单的方法就是使用 margin 属性. margin 属性接受任何长度单位,可以是像素.英寸.毫米或 em. margin 可以设置为 auto.更常见的做法是为外边距设置长度值.下面 ...

  4. SQL按日期Datatime来比较大小

    数据库操作中,通常需要选择某日期以后的记录,比如选择10年1月到11年2月之间的记录,此时用SQL语句编写时,不能直接用">.<.="来选择,因为datetime型数据 ...

  5. QT中的字符串处理函数

    Fn 1 : arg 这个函数的具体声明不写了,它有20个重载,典型的示例代码如下: 1: #include <QtCore/QCoreApplication> 2: #include & ...

  6. spring+mybatis的优缺点

    mybatis的优缺点: 优点: 1. 易于上手和掌握. 2. sql写在xml里,便于统一管理和优化. 3. 解除sql与程序代码的耦合. 4. 提供映射标签,支持对象与数据库的orm字段关系映射 ...

  7. ANDROID_MARS学习笔记_S01原始版_010_ContentProvider

    一.简介 一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <Linea ...

  8. Oracle Form属性、内置子程序、触发器、系统变量简要

    一.属性 1.1 通用属性 名称(Name) 子类信息(Subclass Information) 备注(Comments) 标题(Title) 方向(Direction) 字体名称(Font Nam ...

  9. bzoj1914

    这道题用转化补集的思想一下就很简单了考虑不包括原点的三角形,显然对于一个点,它与原点构成的直线在这条直线同侧的任意两点和这个点构成的三角形一定不是黄金三角形为了避免重复我们只考虑直线上方的两点然后我们 ...

  10. 做一个自己的最小Linux系统

     一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...