携带复选框CheckBox的ListView,屏蔽checkbox的点击事件
由于需要复用布局里的控件,所以需要解决复用checkBox时,数据出现错乱,解决办法如下:
封装一个数据类,在该类中设置一个选没选中的属性,这样就可以解决问题了,即:将数据封装成实体类,并加一个成员变量来记录选没选中
/** * 数据 */ public class MyData { private String text;//显示的文本 /** * 用于记录是否选中,因为在复用的时候,数据对象是不同的 */ private boolean checked; public void setText(String text) { this.text = text; } public void setChecked(boolean checked) { this.checked = checked; } public String getText() { return text; } public boolean isChecked() { return checked; } }
MainActivity
/** * 带chencBox的ListView */ public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayList<MyData> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); list = new ArrayList<MyData>(); for (int i = 0; i < 20; i++) { MyData data = new MyData(); data.setText("*第" + i + "条数据*"); data.setChecked(false);//代表没有选中 list.add(data); } /** * 切记要将CheckBox设置下面两个属性:不可被点击,也不会获取焦点,这样listView才能被点击 * android:focusable="false" 屏蔽掉chickBox的点击事件,让点击listView的item项来控制复选框的选中与否 * android:clickable="false" */ listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this,"点击了",Toast.LENGTH_SHORT).show(); //当点击了item就改变CheckBox的状态 CheckBox box= (CheckBox) view.findViewById(R.id.checkbox); box.setChecked( !box.isChecked());//状态取反 //注意一定要改变数据里的状态,这样在复用的时候才CheckBox的状态才不会出错 list.get(position).setChecked(box.isChecked()); } }); listView.setAdapter(new MyAdapter()); } class MyAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(MainActivity.this, R.layout.item_layout, null); holder.textView = (TextView) convertView.findViewById(R.id.textView); holder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox); convertView.setTag(holder); }else{ holder= (ViewHolder) convertView.getTag(); } //布局里的对象虽然复用了,但是数据对象是唯一的 MyData data = list.get(position); if(data.isChecked()){ holder.checkBox.setChecked(true); }else{ holder.checkBox.setChecked(false); } holder.textView.setText(data.getText()); return convertView; } } private class ViewHolder { TextView textView; CheckBox checkBox; } }
说明:通过对象的属性来判断是否选中