listView的item中含有checkbox的一些问题及解决办法



问题1
       因为checkbox的点击事件优先级高于listview的item点击事件
所以,checkbox点击后,item的事件将不能触发。
 解决方法:
         要想checkbox和item的事件都能触发,只需要在item的跟
布局中添加 android:descendantFocusability="blocksDescendants"

问题2

    由于baseAdapter里的getview()方法里的convertview参数可以重用item,
导致你选中一个item里的checkbox后,每隔一定长度的item里的checkbox也会显示选中状态

解决方法:
     用一个hashmap记录每个item里checkbox的状态,在每次取出item时,自己根据hashmap里的值
初始化checkbox的状态。

//初始化checkbox的状态值
 h.checkBox.setChecked(checkBoxState.get(position));

    //用一个hashmap记录checkbox的变化值
    h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
     
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     
     checkBoxState.put(position, isChecked);
     
     }
    });

问题3         

   item里含有checkbox并且为它设置了setOnCheckedChangeListener事件,每次调用setChecked()这个方法时,会触发这个事件,而很多
时候调用这个方法时你不想让它触发,所以要先把设个事件设置为null
 
解决方法:

h.checkBox.setOnCheckedChangeListener(null);
               
    h.checkBox.setChecked(checkBoxState.get(position));
   
    h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
     
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     
     checkBoxState.put(position, isChecked);
    
     
     }
     
     
    });
      
在初始化checkbox的状态值前,添加h.checkBox.setOnCheckedChangeListener(null);
 

所以问题2和问题3一般会一起出现,都要一起解决。



 public View getView(final int position, View convertView,
     ViewGroup parent) {
    // TODO Auto-generated method stub
    if (convertView == null) {
     convertView = getLayoutInflater().from(mainActivity.this)
       .inflate(R.layout.itemview, null, false);
     h = new hold();
     h.nameView = (TextView) convertView
       .findViewById(R.id.nameItemTV);
     h.noticeButton = (Button) convertView
       .findViewById(R.id.ItemnoticeBT);
     h.checkBox=(CheckBox) convertView.findViewById(R.id.itemCB);
     
     h.checkBox.setId(position);
     
    // h.editText = (EditText) convertView.findViewById(R.id.itemet);
     convertView.setTag(h);
     
     
    } else {
     
     h = (hold) convertView.getTag();
    }
   
               h.checkBox.setOnCheckedChangeListener(null);
               
   h.checkBox.setChecked(checkBoxState.get(position));
   
    h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
     
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     
     checkBoxState.put(position, isChecked);
     
     }
     
     
    });
  
    return convertView;
   }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值