您的位置:首页 > 其它

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

2016-11-07 09:56 337 查看
问题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;

   }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐