您的位置:首页 > 移动开发 > Android开发

Android ListView带checkBox 实现多选模式

2016-03-03 21:20 519 查看
前言,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点击的时候就可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: