【转】Android:ListView常见错位之CheckBox错位

原文网址:http://blog.csdn.net/lemon_tree12138/article/details/39337867

ListView在什么样的情况下会出现错位?错位的原因是什么?怎么解决?下面的内容会对这些问题做一个讲解。

1.ListView在什么样的情况下会出现错位?

其实错位是当我们的ListView的每个单项(item)从屏幕中移入或是移出,我们的系统会对这个item的状态进行重新定义——是否被选中等等。一般只是显示的情况下,我们的ListView很少出现错位,因为状态没有改变。

我们现在就是拿一个CheckBox组件来说明,因为CheckBox是一个比较基础的换件,而且CheckBox的状态改变比较明显。

例如下面这种情况:

初始界面中选中第0个和第1个:

当我们对屏幕进行滑动再回来的时候,我们会看到,第0个的CheckBox的勾不见了。第9个的CheckBox出现了勾,这是个就是错位。

也就是说我们在重新加载由屏幕之外的item移到屏幕之内时,CheckBox的状态发生改变。

如是,我们想是不是有一种方法来记录这种变化,且变化只是在监听器监听到有需要改变的状态发生时,才会变化。

这里我们用一个ArrayList<Boolean>的数组来记录。

关键代码如下:

[java] view plaincopyprint?

  1. public View getView(final int position, View convertView, ViewGroup parent) {
  2. ViewHolder viewHolder = null;
  3. if (recordMap.get(position) == null) {
  4. convertView = mInflater.inflate(R.layout.listview_item, null);
  5. viewHolder = new ViewHolder(convertView);
  6. Log.i(TAG, "1: " + position);
  7. final int finalP = position;
  8. recordMap.put(position, convertView);
  9. viewHolder.checkBox.setOnClickListener(new OnClickListener() {
  10. @Override
  11. public void onClick(View v) {
  12. CheckBox checkBox = (CheckBox)v;
  13. isChecked.set(finalP, checkBox.isChecked());
  14. }
  15. });
  16. convertView.setTag(viewHolder);
  17. } else {
  18. Log.i(TAG, "2: " + position);
  19. convertView = recordMap.get(position);
  20. viewHolder = (ViewHolder) convertView.getTag();
  21. }
  22. viewHolder.button.setText("click " + position);
  23. viewHolder.checkBox.setChecked(isChecked.get(position));
  24. return convertView;
  25. }

----------------------------------------------- 程序源码下载

时间: 2024-10-22 14:48:04

【转】Android:ListView常见错位之CheckBox错位的相关文章

Android ListView常见属性问题

Question 1: listview在拖动的时候背景图片消失变成黑色背景.等到拖动完毕我们自己的背景图片才显示出来. 解决办法: xml中: android:scrollingCache="false"  或者 android:cacheColorHint="#00000000" 代码中: setScrollingCacheEnabled(false)  或者 setCacheColorHint(0)  或者setCacheColorHint(Color.TRA

android listview异步加载图片错位,重复,闪烁分析以及解决方案

我们在使用listview异步加载图片 的时候,在快速滑动或者网络不好的情况下,会出现图片错位,重复,闪烁等问题,其实这些问题总结起来就是一个问题, 比如listview上有100个item,一屏只显示10个item,我们知道getView()中converView是用来复用view对象的,因为一个item的view对象,而imageview控件就是view通过findViewById()获得的,而我们在复用view对象时,也就是说这个imageview也被复用了,比如第11个item的view

Android ListView异步加载图片错位、重复、闪烁分析以及解决方案

我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通过findViewById()获得的,而我们在复用View对象时,同时这个Ima

Android ListView常见配置说明

ListView是我们经常使用的控件,但是使用中却因为各种原因无法设置出我们需要的效果,现将常用的设置记录下来方便以后查询. 1.拖动时背景变黑 android:cacheColorHint="#00000000" 2.设置了listSelector后无效 android:drawSelectorOnTop="true" 3.listSelector表示选中的背景图片,有时候我们需要设置按下的背景(不是选中),则需要如下设置: ①先创建一个xml文件放到drawab

android ListView中CheckBox错位的解决

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

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

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

案例: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

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

Android ListView getView()方法重复调用导致position错位

问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者match_parent. <ListView android:id="@+id/myphoto_listview" android:layout_width="match_parent" android:layout_height="match_pare