如何在适配器视图中为复选框添加侦听器,Android,ArrayAdapter,onCheckedChanged,OnCheckedChangeListener

Kev*_*vik 8 android listener adapter oncheckedchanged android-arrayadapter

在此输入图像描述

我有一个listView,通过ArrayAdapter填充小xml子视图.每个小视图里面只有两个东西,一个复选框和一个旁边的字符串标签.

我想设置一个onCheckedChanged监听器来捕获用户检查或取消选中复选框的事件.

例如这里显示的听众:

 listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

 @Override
 public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

 Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();

 }
Run Code Online (Sandbox Code Playgroud)

}

我在哪里放置监听器代码?以及如何设置?

ArrayAdapter的代码:

  public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{
    CheckBoxInfo[] objects;
    Context context;
    int textViewResourceId;

    public MobileArrayAdapter(Context context, int textViewResourceId,
        CheckBoxInfo[] objects) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.textViewResourceId = textViewResourceId;
        this.objects = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row_layout_view = convertView;


            if ((row_layout_view == null)){


                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row_layout_view = inflater.inflate(R.layout.row_layout, null);
            }   

          //CheckBoxInfo item = objects.get(position);  // for arrayList
            CheckBoxInfo item = objects[position];

            if(item != null){

            TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1);
            CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1);

            if(item !=null){
            textView.setText(item.checkBoxName);
            checkBox.setChecked(item.checkBoxState);
               }
            }
            return row_layout_view;
    }


}
Run Code Online (Sandbox Code Playgroud)

Dav*_*arl 33

不要使用您的示例listView.setOnCheckedChangeListeneronCheckedChanged代码.

首先CheckBox,你应该使用setOnClickListener()而不是setOnCheckedChangeListener().您可以在onClick()函数内部获取已检查状态.

其次,将您的setOnClickListener()内部getView()功能放在列表适配器中.

示例:

checkBox.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        final boolean isChecked = checkBox.isChecked();
        // Do something here.
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的行为.当View被重用时,它的所有子视图子项都具有被回收的无意义视图的特征.因此,您必须每次都在`getView()`中更新所有视图及其属性.这包括设置CheckBox值以及它的`OnClickListener`.总之,保留监听器并添加`checkBox.setChecked()`以将其设置为期望值,以防再循环(或新)视图具有不同的设置. (4认同)
  • 由于listview回收视图,我认为这不起作用.向下滚动并回收选定的convertView时,选中的行将变为未选中状态.你怎么解决这个问题? (3认同)