我有一个列表视图该列表项包含一个复选框的问题。当我检查框和滚动列表,复选框,有时自动调用oncheckedchange和复选框的值被改变!
或者,当我的名单上有超过9或10个项目,然后当我检查,在第1项,第8项或9检查???
任何人都可以告诉我,我该怎么解决这个bug?
在此先感谢!
list_item.xml
< ImageView的
机器人:layout_alignParentLeft =真
机器人:layout_width =36dip
机器人:layout_height =36dip
机器人:layout_centerVertical =真
机器人:scaleType =fitCenter
机器人:ID =@ + ID / image_view
机器人:SRC =@可绘制/图标/>
< TextView的Android版本:layout_toRightOf =@ ID / image_view
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:以下属性来=5dip
机器人:ID =@ + ID / text_view
机器人:行=1
机器人:TEXTSIZE =20SP
机器人:文字颜色=@色/白/>
< TextView的Android版本:layout_toRightOf =@ ID / image_view
机器人:layout_below =@ ID / text_view
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:以下属性来=5dip
机器人:ID =@ + ID / text_view2
机器人:TEXTSIZE =14sp
机器人:行=1
机器人:文字颜色=@色/白/>
这里是适配器的看法:
公开查看getView(INT位置,查看convertView,ViewGroup中父){
Log.e(TAG,getView);
ViewHolder mViewHolder;
如果(convertView == NULL){
Log.e(TAG,充气膨胀是......);
convertView = mInflater.inflate(R.layout.custom_list_app,NULL);
mViewHolder =新ViewHolder();
mViewHolder.checkbox =(复选框)convertView.findViewById(R.id.checkbox);
mViewHolder.remove = convertView.findViewById(R.id.music_info);
convertView.setTag(mViewHolder);
} 其他 {
mViewHolder =(ViewHolder)convertView.getTag();
Log.e(TAG的位置:+位置+复选框:+ mViewHolder.checkbox.isChecked());
}
mViewHolder.checkbox.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton CB,布尔标志){
// TODO自动生成方法存根
如果(旗){
Log.d(TAG复选框选中);
} 其他 {
Log.d(TAG复选框取消选中);
}
}
});
返回convertView;
}
解决方案
在的ListView
回收的视图类:你需要明确设置复选框是否被选中在 getView
类。因此,增加一个检查像
/ **
*确保没有其他setOnCheckedChangeListener连接,然后手动
*改变其状态。
* /
mViewHolder.checkbox.setOnCheckedChangeListener(空);
如果(shouldBeChecked)mViewHolder.checkbox.setChecked(真正的);
否则mViewHolder.checkbox.setChecked(假);
在打电话之前 setOnCheckedChangeListener
。
I have a problem with listview which list item contain a checkbox. When i check a box and scroll list, checkbox sometime auto call oncheckedchange and value of checkbox is changed!
Or, when my list has more than 9 or 10 item, then when i checked at item 1, item 8 or 9 is checked???
Anyone can tell me what do i fix this bug?
Thanks in advance!
list_item.xml
<ImageView
android:layout_alignParentLeft="true"
android:layout_width="36dip"
android:layout_height="36dip"
android:layout_centerVertical="true"
android:scaleType="fitCenter"
android:id="@+id/image_view"
android:src="@drawable/icon" />
<TextView android:layout_toRightOf="@id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:id="@+id/text_view"
android:lines="1"
android:textSize="20sp"
android:textColor="@color/white" />
<TextView android:layout_toRightOf="@id/image_view"
android:layout_below="@id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:id="@+id/text_view2"
android:textSize="14sp"
android:lines="1"
android:textColor="@color/white" />
and here is adapter view:
public View getView(int position, View convertView, ViewGroup parent) {
Log.e(TAG, "getView");
ViewHolder mViewHolder;
if (convertView == null) {
Log.e(TAG, "Inflater is inflating...");
convertView = mInflater.inflate(R.layout.custom_list_app, null);
mViewHolder = new ViewHolder();
mViewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
mViewHolder.remove = convertView.findViewById(R.id.music_info);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
Log.e(TAG, "Position: " + position + " CheckBox: " + mViewHolder.checkbox.isChecked());
}
mViewHolder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton cb, boolean flag) {
// TODO Auto-generated method stub
if (flag) {
Log.d(TAG, "Checkbox checked");
} else {
Log.d(TAG, "Checkbox un-checked");
}
}
});
return convertView;
}
解决方案
The ListView
recycles the view classes: you will need to explicitly set whether or not the CheckBox is checked in the getView
class. So add a check like
/**
* Ensure no other setOnCheckedChangeListener is attached before you manually
* change its state.
*/
mViewHolder.checkbox.setOnCheckedChangeListener(null);
if(shouldBeChecked) mViewHolder.checkbox.setChecked(true);
else mViewHolder.checkbox.setChecked(false);
before you call setOnCheckedChangeListener
.