Android关于ListView的item中带checkBox的解决方案

本文分享了使用ListView实现商品添加购物车时的多选功能和点击item查看商品详细信息的过程,包括解决点击事件冲突的方法、自定义checkBox样式以及Adapter类的实现。附带完整代码和源码下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        公司的项目中商品添加购物车用到了ListView中带多选框实现多选,并且点击item可以查看到该商品的详细信息,现把自己实现过程中遇到的问题及解决思路分享出来,供大家参考,本篇为小生的第一篇博客,主要是为了记录自己的成长,希望大家支持,指教。源码下载地址:http://download.youkuaiyun.com/detail/qq_28517673/9454788

        首先,布局文件:布局文件需要注意的是listview中的item中的如果包含Button,checkBox,RadioButton等控件,会导致点击事件的冲突,这是由于android事件分发机制导致的,此时只需要为子控件添加android:focusable="false"属性,就可解决点击事件冲突。

        <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="4dp" >

<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:ellipsize="end"
android:maxLines="2"
android:text=""
android:textColor="#383838"
android:textSize="16sp" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:orientation="horizontal" >

<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="#E66230"
android:textSize="16sp" />

<CheckBox
android:id="@+id/cb_check"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginRight="5dp"
android:background="@drawable/checkbox_check_bg"
android:button="@null"
android:focusable="false" />

</LinearLayout>
</LinearLayout>

   蓝色字体部分,为自定义的checkBox背景样式(默认的样式难以满足需求),此时必须设置android:button="@null",

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/icon_check_true" android:state_checked="true"></item>
    <item android:drawable="@drawable/icon_check_true" android:state_selected="true"></item>
    <item android:drawable="@drawable/icon_check_true" android:state_pressed="true"></item>
    <item android:drawable="@drawable/icon_check_false"></item>

</selector>

背景图可以根据项目需求截图替换到此,布局文件已经写完。


然后,我们现在创建一个商品类Goods,属性有名字,价格和是否选中(isCheck属性是关键),

public class Goods {

public String id;//商品的唯一标识

public  String name;
public int price;
public boolean isCheck;//是否选中
}

下面是Activity代码,非常简单,这里不多说

public class MainActivity extends Activity {
    private ListView lv;
    private ListViewAda adapter;
    private List<Goods> lists = new ArrayList<Goods>();

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

    }

  private void initData() {
     for (int i = 0; i < 20; i++) {
            Goods goods = new Goods();
            goods.id = "" + i + 1;
            goods.name = "张三" + i;
            goods.price = 100 + i;
            goods.isCheck = false;// 这里默认都为未选中状态
            lists.add(goods);
        }
        adapter.notifyDataSetChanged();
    }

    private void initView() {
        lv = (ListView) findViewById(R.id.listView1);
        adapter = new ListViewAda(lists, MainActivity.this);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(MainActivity.this, position + "被点击了",
                        Toast.LENGTH_LONG).show();

            }
        });
    }

}


最后,到了最关键部分,Adapter类,先贴代码;

public class ListViewAda extends BaseAdapter {
    private List<Goods> lists = new ArrayList<Goods>();
    private LayoutInflater inflater;
    private Context context;
    private List<Goods> shopCart = new ArrayList<Goods>();//购物车列表

    public ListViewAda(List<Goods> lists, Context context) {
        super();
        this.lists = lists;
        this.context = context;
        this.inflater = inflater.from(context);
    }

    @Override
    public int getCount() {
        if (lists.size() > 0)
            return lists.size();
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return lists.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder vh = null;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = inflater.inflate(R.layout.ada_layput, null);
            vh.tvName = (TextView) convertView.findViewById(R.id.textView1);
            vh.tvPrice = (TextView) convertView.findViewById(R.id.textView2);
            vh.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.tvName.setText(lists.get(position).name);
        vh.tvPrice.setText(Integer.toString(lists.get(position).price)
                .toString());
        String id = lists.get(position).id;
        if (shopCart.size() > 0) {
            for (int i = 0; i < shopCart.size(); i++) {
                if (id.equals(shopCart.get(i).id)) {
                    lists.get(position).isCheck = true;
                }
            }
        }

        vh.cb.setChecked(lists.get(position).isCheck);
        vh.cb.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String id = lists.get(position).id;
                Boolean check = lists.get(position).isCheck;
                if (check == true) {// 表示已经选中
                    lists.get(position).isCheck = false;
                    for (int i = 0; i < shopCart.size(); i++) {
                        if (id.equals(shopCart.get(i).id)) {
                            shopCart.remove(i);
                        }
                    }

                } else {
                    lists.get(position).isCheck = true;

                    // 避免重复先移除再添加
                    for (int i = 0; i < shopCart.size(); i++) {
                        if (id.equals(shopCart.get(i).id)) {
                            shopCart.remove(i);
                        }
                    }
                    shopCart.add(lists.get(position));
                }
                Toast.makeText(context, "您的购物车中现有" + shopCart.size() + "件商品",
                        Toast.LENGTH_SHORT).show();
            }

        });

        return convertView;
    }

    class ViewHolder {
        TextView tvName, tvPrice;
        CheckBox cb;
    }

    这里必须用checkBox的setOnclickListener监听,不能用setOnCheckedChangeListener监听,用setOnCheckedChangeListener

监听,adapter复用View时,会导致checkBox的点击状态显示错乱。

       



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值