zoukankan      html  css  js  c++  java
  • 【转】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>的数组来记录。

    关键代码如下:

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

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

  • 相关阅读:
    javascript实现非递归--归并排序
    javascript实现二分查找
    深入javascript作用域链到闭包
    c++学习笔记2--constexpr,类型别名,auto
    用 Numba 加速 Python 代码
    Django1和2的区别
    Git的使用
    文件锁fcntl
    Https原理
    Flask-Login
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4491882.html
Copyright © 2011-2022 走看看