复选框自动调用onCheckedChange当列表视图滚动?视图、复选框、列表、onCheckedChange

2023-09-12 08:36:27 作者:予笙

我有一个列表视图该列表项包含一个复选框的问题。当我检查框和滚动列表,复选框,有时自动调用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的Andr​​oid版本:layout_toRightOf =@ ID / image_view
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:以下属性来=5dip
    机器人:ID =@ + ID / text_view
    机器人:行=1
    机器人:TEXTSIZE =20SP
    机器人:文字颜色=@色/白/>

< TextView的Andr​​oid版本: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(假);
 
如何在mac上的outlook设置exchange

在打电话之前 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.