天天看点

【Android】关于ListView的Item含有CheckBox所遇到的一些问题

这是我作为Android开发人员的第一篇博文,书写一些我自己遇到的问题,希望对你们有所帮助。如果有更好的见解,望能够提出,如果我有错误,也希望多多指教。

问题1:

listView点击事件与CheckBox点击冲突问题:

如果不做任何处理,会发现只能选择Checkbox,而你设置的listView中item点击事件没有反应,这是因为checkBox的点击事件优先级高于listview的点击事件,需要做的处理是:添加android:focusable=“false”

<CheckBox
        android:id="@+id/button"
        android:layout_width="30dp"
        android:onClick="click"
        android:layout_height="match_parent"
        **android:focusable="false"**/>

           

问题2:

获取到你所选中的listView的item的内容(可能是多条):

首先我们一个list保存CheckBox的选中状态,默认false,

private List<Boolean> mChecked = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
            mChecked.add(false);
        }
           

然后在Adapter中,当你点击CheckBox的时候,更改list中你所保存的状态。

holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mChecked.set(position, holder.checkBox.isChecked());
            }
        });
           

这样你就可以获取到,整个listView中CheckBox的状态。我们便可以将True的取出来,即选中的内容

for (int i = 0; i < mChecked.size(); i++) {
            if (mChecked.get(i).equals(true)) {
                list.get(i).get***
                //做你所需要的处理
            }
        }
           

问题3:

listView的item复用问题,导致CheckBox的选中状态,会随着滑动发生错变:

如果你不对其做处理。但你选中一项后,滑动listView,因为复用问题,当选中的一条滑出屏幕再显示出来,选中状态会改变;或者是新滑进屏幕的一些选项默认成了选中状态,这就需要我们记住他们的状态即可。

如果你做了问题2所做的处理,那就很简单了。

只需要在adapter赋值操作中。将你所保存的Checkbox状态赋值给他就ok了。

holder.checkBox.setChecked(mChecked.get(i));

           

目前我所遇到的问题,用上述方法都可以解决。贴上代码:

MainActivity 代码

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private List<listBean> list = new ArrayList<>();
    private List<Boolean> mChecked = new ArrayList<>();
    private String JsonStr = "";//自己整点数据源即可

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initListView();
    }

    private void initListView() {

list = com.alibaba.fastjson.JSONArray.parseArray(JsonStr, listBean.class);
 //初始化选中状态,默认全不选中
        mChecked = new ArrayList<Boolean>();
        for (int i = 0; i < list.size(); i++) {
            mChecked.add(false);
        }
//放到Adapter的构造中,为了传回mChecked,在Activity中处理
        MyAdapter adapter = new MyAdapter(mChecked,list, MainActivity.this);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                //listView点击事件
            }
        });
    }

    private void initView() {
        listView = (ListView) findViewById(R.id.listView);
        
    }
//Toast出你选中的某些项的内容(做你的处理)
    public void click(View view) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < mChecked.size(); i++) {
            if (mChecked.get(i).equals(true)) {
             builder.append(list.get(i).getCtname()+"\n");
            }
        }
        Toast.makeText(this, builder, Toast.LENGTH_SHORT).show();
    }
  }
           

适配器代码

public class MyAdapter extends BaseAdapter {


    private List<Boolean> mChecked;
    private List<listBean> list;
    private Context context;


    public MyAdapter(List<Boolean> mChecked, List<listBean> list, Context context) {
        this.mChecked = mChecked;
        this.list = list;
        this.context = context;
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }


    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {

        final ViewHolder holder;
        if (convertView==null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.layout_item, null);
            holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
            holder.name = (TextView) convertView.findViewById(R.id.name);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.name.setText(list.get(i).getCtname().toString());
        holder.checkBox.setChecked(mChecked.get(i));

        final int position = i;
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mChecked.set(position, holder.checkBox.isChecked());
            }
        });
        return convertView;
    }

    class ViewHolder{
        private CheckBox checkBox;
        private TextView name;
    }
}