ListView视图缓存错位问题

由于之前写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消息列表也是滑动的话就隐藏删除按钮,我不知道是否规避这个问题,因为ListView内存的item数据一般大于屏幕可见的item数据,所以即使屏幕大也看不到。

时间: 2024-10-13 04:09:01

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

Android基础入门教程——2.4.5 ListView之checkbox错位问题解决

Android基础入门教程--2.4.5 ListView之checkbox错位问题解决 标签(空格分隔): Android基础入门教程 本节引言: 作为ListView经典问题之一,如果你尝试过自定义ListView的item,在上面带有一个checkbox的话,那么 当你的item数超过了一页的话,就会出现这个问题,下面我们来分析下出现这种问题的原因,以及如何来 解决这个问题! 1.问题发生的原因: 这是网上找来的一幅关于ListView getView方法调用机制的一个图 上图中有一个Re

[转]Android性能优化之ListView的缓存机制

要想优化ListView首先要了解它的工作原理,列表的显示需要三个元素:ListView.Adapter.显示的数据: 这里的Adapter就是用到了适配器模式,不管传入的是什么View在ListView中都能显示出来. 下面简单说下上图的原理: 1.如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler中 2.ListView先请求一个type1视图(getView)然后请求其他可见的项目

案例:ListView中checkbox错位问题及onCreateContextMenu失效问题

本文涉及两个问题: ListView中checkbox错位问题 oncreateContextMenuListener失效问题 activity_listview_item.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo

ListView之checkbox错位问题解决

本节引言: 作为ListView经典问题之一,如果你尝试过自定义ListView的item,在上面带有一个checkbox的话,那么 当你的item数超过了一页的话,就会出现这个问题,下面我们来分析下出现这种问题的原因,以及如何来 解决这个问题! 1.问题发生的原因: 这是网上找来的一幅关于ListView getView方法调用机制的一个图 上图中有一个Recycler的东东,平时我们ListView上可见的Item处于内存中,而且他的Item则放在 这个Recycler中,第一次加载item

android ListView中CheckBox错位的解决

貌似已经很晚了,但是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,可是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并不是你选中的,百思不得其解.后面通过上网查资料,可是个说纷纭,但是我还是找到了解决办法. 在自定义的适配器中,对checkBox的设置如下: 记住两者的顺序,先对checkBox进行事件监听,再设置其状态.前提在布局中对checkBox的状态设为false. android ListView中CheckBox错位的解决,布布扣,bubuko.

ListView的缓存机制

说到ListView当然少不了Adapter了,Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面的额时候,都会调用Adapter的getView()这个方法返回一个View.这样,ListView中有多少项,就应该调用多少次getView()方法去绘制每一项的界面.如果项数少的时候(几十行),这是没问题的.但是如果有一万行,一百万行,那么就会出现问题了,它会占用系统极大的内存,所以必须采用性能优化的方法. 先说一下ListView的工作原理:ListVie

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

之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容放入到缓冲池中,再从缓存池中拿出新的内容显示出来,这就是ListView的缓存机制,这一机制可以极大的节省系统资源. BaseAdapter BaseAdapter通常用于被扩展,扩展BaseAdapter可以对各项列表进行最大限度的定制. 我们可以用自己的类去继承BaseAdapter,然后实现g

Android错误之ListView加载错位_ListView图片错位

又遇到ListView加载item时,多个item中的图片会错位的情况 现象如下图,同一个人的头像显示的乱七八糟 找了一张图,很好地说明了问题的原因 问题原因就在于convertView的重用,当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView, 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Item8 复用的是Item1时候创建的view, Item8

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

响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持. 此功能将支持ASP.NET 核心 2.1 版本. 在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保持同一个参数的请求,在N段时间内,直接从mvc的缓存中读取,不去走视图的逻辑. [OutputCache(Duration =20)]//设置过期时间为20秒 public ActionResult ExampleCacheAction() { var time=DateTime.Now.ToStr