listview 从adapter中获取数据,adapter中的getview()的一般实现如下,
 
 
  
  1. @Override 
  2. blic View getView(final int position, View convertView, ViewGroup parent) {  
  3.                  
  4.    if(convertView = null ){ 
  5.                convertView = mInflater .inflate(mResource , parent, false); 
  6.           }; 
  7.               
  8.    TextView tv_ItemName = (TextView) convertView.findViewById(  
  9.            R.id. item_name );  
  10.    final CheckBox ckb_Item = (CheckBox) convertView.findViewById(  
  11.            R.id. item_ckb );  
  12.       
  13.    String Item = mItemList.get(position);  
  14.    tv_ItemName.setText( "  "+Item);  
  15.    
  16.    ckb_Item.setOnClickListener( new View.OnClickListener() {  
  17.          
  18.        @Override  
  19.        public void onClick(View v) {  
  20.           
  21.          Item = mItemList.get(position); 
  22.           
  23.           if(ckbItem.isChecked()){ 
  24.                 updateSelectedItemList(Item , true); 
  25.          } else
  26.                  updateSelectedItemList(Item , false); 
  27.          } 
  28.        }  
  29.    });  
  30.  
  31.    return convertView;  
  32.  }   

 

以上的方法在listview中的item数量少于一屏可以正确工作,当listview 中的item个数多于一屏时,对不同屏中相同位置的item会产生相同的操作效果。
 
例如, listview长度为11,若一屏中可以显示的item个数是8, 那么对第一屏的position 为1的item 1 的选择, 同时会导致第二屏中position为1的元素item 9的被操作。
 

 

解决办法是,增加对item选择状态的记录,并且在每一屏新生成时,根据item的状态,显示相应的效果
 
 
  
  1. @Override 
  2. blic View getView( final int position, View convertView, ViewGroup parent) {  
  3.                  
  4.    //重新生成新的一屏 
  5.    convertView = null
  6.          convertView = mInflater .inflate(mResource , parent, false); 
  7.                             
  8.    TextView tv_ItemName = (TextView) convertView.findViewById(  
  9.            R.id. item_name );  
  10.    final CheckBox ckb_Item = (CheckBox) convertView.findViewById(  
  11.            R.id. item_ckb );  
  12.       
  13.    String Item = mItemList .get(position);  
  14.    tv_ItemName.setText( "  " +Item);  
  15.    
  16.        //判断这个item是否已经被选择过 
  17.   if(mSelectedItems.contains(Item)){ 
  18.      ckb_Item.setChecked( true); 
  19.   } else
  20.      ckb_Item.setChecked( false); 
  21.   } 
  22.  
  23.    ckb_Item.setOnClickListener( new View.OnClickListener() {  
  24.          
  25.        @Override   
  26.        public void onClick(View v) {  
  27.           
  28.          Item = mItemList.get(position); 
  29.           
  30.           if (ckbItem.isChecked()){ 
  31.                  updateSelectedItemList(Item , true); 
  32.          } else { 
  33.                  updateSelectedItemList(Item , false); 
  34.          } 
  35.        }  
  36.    });  
  37.  
  38.    return convertView;  
  39.  }