• Android:ListView常见错位之CheckBox错位


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

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

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

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

    例如下面这种情况:

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


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


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

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

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

    关键代码如下:

    public View getView(final int position, View convertView, ViewGroup parent) {
    		ViewHolder viewHolder = null;
    		if (recordMap.get(position) == null) {
    			
    			convertView = mInflater.inflate(R.layout.listview_item, null);
    			viewHolder = new ViewHolder(convertView);
    			Log.i(TAG, "1: " + position);
    
    			final int finalP = position;
    			recordMap.put(position, convertView);
    			viewHolder.checkBox.setOnClickListener(new OnClickListener() {
    				
    				@Override
    				public void onClick(View v) {
    					CheckBox checkBox = (CheckBox)v;
    					isChecked.set(finalP, checkBox.isChecked());
    				}
    			});
    			
    			convertView.setTag(viewHolder);
    		} else {
    			Log.i(TAG, "2: " + position);
    			convertView = recordMap.get(position);
    			viewHolder = (ViewHolder) convertView.getTag();
    		}
    		
    		viewHolder.button.setText("click " + position);
    		viewHolder.checkBox.setChecked(isChecked.get(position));
    		
    		return convertView;
    	}


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

  • 相关阅读:
    用GD库生成高质量的缩略图片[转载]
    Linux流量监控工具 iftop (最全面的iftop教程)
    数据库开发数据库使用连接池
    过去时的那些硬件和软件
    关于及时回收(GC)系统资源的析构对象的的示例
    控制好节奏,踏实做好每件事
    如何管理IIS,自动创建WEB SITE,应用程序池
    数据库开发数据库的Data Base connection 简单池功能启示
    .Net MSMQ在分布式中的应用
    高并发高负载网站的系统架构注意的问题
  • 原文地址:https://www.cnblogs.com/fengju/p/6336146.html
Copyright © 2020-2023  润新知