列表视图滚动时,复选框自动调用onCheckedChange?

kha*_*ntt 32 checkbox android listview

我对listview有一个问题,哪个列表项包含一个复选框.当我选中一个框并滚动列表时,复选框有时会自动调用oncheckedchange并且复选框的值会更改!

或者,当我的列表超过9或10项时,当我在项目1检查时,项目8或9被检查???

任何人都可以告诉我,我该修复这个错误?

提前致谢!

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" />          
Run Code Online (Sandbox Code Playgroud)

这是适配器视图:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

Fem*_*emi 74

ListView回收的视图类:你需要明确设置在该复选框是否被选中getView类.所以添加支票就好

/**
*    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);
Run Code Online (Sandbox Code Playgroud)

在你打电话之前setOnCheckedChangeListener.

  • 让我重复一遍:你必须调用`setChecked(true)`或`setChecked(false)`每次调用`getView`如果你重写`getView`. (3认同)
  • 费米,说得对.我错过了将onchangelistner设置为null的调用,并且更改的检查是自动触发的.在设置值之前取消设置listnener是至关重要的. (3认同)

小智 5

holder.cBox.setOnCheckedChangeListener(null);
holder.cBox.setChecked(list.get(position).isChecked());
holder.tvName.setText(item.getName());

holder.cBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if (isChecked)
        {
            list.get(position).setChecked(true);
        }
        else
        {
            list.get(position).setChecked(false);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

在列表中,该项目具有用于设置是否选中该项目的属性。您可以使用它来设置是否选中项目,然后首先设置

cBox.setOnCheckedChangeListener(null);
cBox.setChecked(list.get(position).isChecked());
Run Code Online (Sandbox Code Playgroud)

然后设置真实 new OnCheckedChangeListener()

我希望我的回答对您以及那些查看此页面或处理带有项目复选框的列表视图的人有用。