Android ListView带checkBox 实现多选模式

来源:互联网 发布:vb中name是什么意思 编辑:程序博客网 时间:2024/06/14 11:22

前言,listView 是我们开发时候,经常使用的控件,所以listView我们都要很熟悉,我是新手,在这里记录下,自己显示listView 带checkbox实现多选模式, 这里就用项目的文件来说明下
首先是布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:minHeight="102dp">    <ImageView        android:id="@+id/id_iv_allbg"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="15dp"        android:background="@mipmap/all_item_bg"/>    <TextView        android:id="@+id/id_tv_add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="15dp"        android:layout_toRightOf="@+id/id_iv_allbg"        android:text="绿地之窗云峰座"        android:textColor="@color/color333"        android:textSize="15dp"/>    <TextView        android:id="@+id/id_tv_jjia"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/id_tv_add"        android:layout_marginTop="7dp"        android:layout_toRightOf="@+id/id_iv_allbg"        android:text="均价 : "        android:textColor="@color/color999"        android:textSize="12dp"/>    <TextView        android:id="@+id/id_tv_price"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/id_tv_jjia"        android:layout_toRightOf="@+id/id_tv_jjia"        android:text=" 7000/㎡"        android:textColor="@color/color999"        android:textSize="12dp"/>    <TextView        android:id="@+id/id_tv_detail"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/id_tv_jjia"        android:layout_marginTop="7dp"        android:layout_toRightOf="@+id/id_iv_allbg"        android:text="金水区花园路龙门路交互处西300米"        android:textColor="@color/color999"        android:textSize="12dp"/>    <RelativeLayout        android:id="@+id/id_rl_yjin"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/id_tv_detail"        android:layout_marginTop="10dp"        android:layout_toRightOf="@+id/id_iv_allbg"        android:background="@drawable/all_yijinbg">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="2dp"            android:text="佣"            android:textColor="@color/white"            android:textSize="11dp"/>        <TextView            android:id="@+id/id_tv_yjin"            android:layout_width="62dp"            android:layout_height="15dp"            android:gravity="end"            android:paddingRight="5dp"            android:text="最高3%"            android:textColor="@color/colorffa64d"            android:textSize="11dp"/>    </RelativeLayout>    <TextView        android:id="@+id/id_tv_ls"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/id_tv_detail"        android:layout_marginLeft="7dp"        android:layout_marginTop="10dp"        android:layout_toRightOf="@+id/id_rl_yjin"        android:background="@drawable/ls"        android:gravity="center"        android:minWidth="33dp"        android:text="期房"        android:textColor="@color/color99d5f1"        android:textSize="11dp"/>    <TextView        android:id="@+id/id_tv_zs"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/id_tv_ls"        android:layout_marginLeft="5dp"        android:layout_toRightOf="@+id/id_tv_ls"        android:background="@drawable/zs"        android:gravity="center"        android:minWidth="33dp"        android:text="在售"        android:textColor="@color/colord79bc7"        android:textSize="11dp"/>    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/id_tv_ls"        android:layout_marginLeft="5dp"        android:layout_toRightOf="@+id/id_tv_zs"        android:background="@drawable/qf"        android:gravity="center"        android:minWidth="33dp"        android:text="在售"        android:textColor="@color/color30bd81"        android:textSize="11dp"/>    <CheckBox        android:id="@+id/id_cb_dele"        android:focusable="false"        android:clickable="false"        style="@style/CustomCheckboxTheme"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/id_tv_jjia"        android:layout_alignParentRight="true"        android:layout_marginRight="13dp"        android:baselineAlignBottom="true"/>    <View        style="@style/set_line"        android:layout_below="@+id/id_iv_allbg"/>    <!--        android:focusable="false" 不让CheckBox 点击  把checkBox 的点击事件 交给item去处理了        android:clickable="false" --></RelativeLayout>

这里值得注意的就是 ,一定要把checkbox的 android:focusable=”false” android:clickable 这两个属性改成false ,我本来想让checkbox 也可以点击 ,item也可以点击,但是 实现起来太麻烦了 ,而且也没有太多的 必要,把两个属性直接改成false 点击你点击checkbox其实也是在点击item,所以效果还是可以的
2, 接下来就是我们所熟悉的适配器 adpater了

package com.dhfjj.program.adapters;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.TextView;import com.dhfjj.program.R;import java.util.HashMap;/** * Created by Administrator on 2016/2/19. */public class YxLpAdapter extends BaseAdapter {    private Context mContext;    private Button mbtSure;    private HashMap<Integer, Boolean> status = new HashMap<>();    public YxLpAdapter(Context mContext,Button mbtSure) {        this.mContext = mContext;        this.mbtSure = mbtSure;    }    public HashMap<Integer, Boolean> getStatus() {        return status;    }    @Override    public int getCount() {        return 10;    }    @Override    public Object getItem(int position) {        return null;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder = null;        if (convertView == null) {            viewHolder = new ViewHolder();            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_lvyxlp, parent, false);            viewHolder.tvAdd = (TextView) convertView.findViewById(R.id.id_tv_add);            viewHolder.tvPrice = (TextView) convertView.findViewById(R.id.id_tv_phone);            viewHolder.tv_Addressdetail = (TextView) convertView.findViewById(R.id.id_tv_detail);            viewHolder.tv_yjin = (TextView) convertView.findViewById(R.id.id_tv_yjin);            viewHolder.cb_detel = (CheckBox) convertView.findViewById(R.id.id_cb_dele);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        final ViewHolder finalViewHolder = viewHolder;        viewHolder.cb_detel.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    if (isChecked) {                        status.put(position, isChecked);                        finalViewHolder.cb_detel.setTag(status);                    } else {                        status.remove(position);                    }            }        });        viewHolder.cb_detel.setChecked(status.get(position) == null ? false : true);        return convertView;    }    private class ViewHolder {        TextView tvAdd; // 楼盘 名称        TextView tvPrice; // 均价        TextView tv_Addressdetail; // 楼盘的地址详细        TextView tv_yjin;// 佣金        CheckBox cb_detel; // 删除    }}

这里就是 item复用的问题,自己维护一个map去保存checkBox选中的状态.

viewHolder.cb_detel.setChecked(status.get(position) == null ? false : true);

这句话就是是不是显示checkBox的选中的状态
3,下面就是listView item的点击事件

 Itemstatus = mLpAdapter.getStatus();        //   保存  那几个被选中 了        final HashMap<Integer, Boolean> mapBoolean = new HashMap<>();        mlvYxLP.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                RelativeLayout rlView = (RelativeLayout) view;                CheckBox cb_detel = (CheckBox) rlView.getChildAt(9);                cb_detel.setChecked(!cb_detel.isChecked());                Boolean aBoolean = Itemstatus.get(position);                // 如果是 选中的状态                if (aBoolean != null && aBoolean) {                    if (mapList.size() <= 2) {                        mapBoolean.put(position, aBoolean);                        mapList.add(mapBoolean);                        mbtdetele.setVisibility(View.VISIBLE);                        //  TODO 在这里把选中楼盘的名字 添加到集合里 , 用于在 推荐客户里面显示                    } else {                        ToastUtils.showToast(AddLoupActivity.this, "最多添加3个");                        // 数量超过3个的时候, 不让它处于选中的状态                        cb_detel.setChecked(false);                    }                } else {                    // 为空的话,就把选择的 remove 掉                    mapList.remove(mapBoolean);                    if (mapList.size() == 0) {                        mbtdetele.setVisibility(View.GONE);                    }                }            }        });

这里item的代码的注释都很清楚
好了到这里就可以实现,item点击的时候就可以

0 0
原创粉丝点击