携带复选框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;
    }
}

说明:通过对象的属性来判断是否选中

posted @ 2016-09-06 22:40  ts-android  阅读(1722)  评论(0编辑  收藏  举报