listview 从adapter中获取数据,adapter中的getview()的一般实现如下,
- @Override
- blic View getView(final int position, View convertView, ViewGroup parent) {
- if(convertView = null ){
- convertView = mInflater .inflate(mResource , parent, false);
- };
- TextView tv_ItemName = (TextView) convertView.findViewById(
- R.id. item_name );
- final CheckBox ckb_Item = (CheckBox) convertView.findViewById(
- R.id. item_ckb );
- String Item = mItemList.get(position);
- tv_ItemName.setText( " "+Item);
- ckb_Item.setOnClickListener( new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Item = mItemList.get(position);
- if(ckbItem.isChecked()){
- updateSelectedItemList(Item , true);
- } else{
- updateSelectedItemList(Item , false);
- }
- }
- });
- return convertView;
- }
以上的方法在listview中的item数量少于一屏可以正确工作,当listview 中的item个数多于一屏时,对不同屏中相同位置的item会产生相同的操作效果。
例如, listview长度为11,若一屏中可以显示的item个数是8, 那么对第一屏的position 为1的item 1 的选择, 同时会导致第二屏中position为1的元素item 9的被操作。
解决办法是,增加对item选择状态的记录,并且在每一屏新生成时,根据item的状态,显示相应的效果
- @Override
- blic View getView( final int position, View convertView, ViewGroup parent) {
- //重新生成新的一屏
- convertView = null;
- convertView = mInflater .inflate(mResource , parent, false);
- TextView tv_ItemName = (TextView) convertView.findViewById(
- R.id. item_name );
- final CheckBox ckb_Item = (CheckBox) convertView.findViewById(
- R.id. item_ckb );
- String Item = mItemList .get(position);
- tv_ItemName.setText( " " +Item);
- //判断这个item是否已经被选择过
- if(mSelectedItems.contains(Item)){
- ckb_Item.setChecked( true);
- } else{
- ckb_Item.setChecked( false);
- }
- ckb_Item.setOnClickListener( new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Item = mItemList.get(position);
- if (ckbItem.isChecked()){
- updateSelectedItemList(Item , true);
- } else {
- updateSelectedItemList(Item , false);
- }
- }
- });
- return convertView;
- }
转载于:https://blog.51cto.com/whithin/1134519