当我们在写商城App时,在购物车这个页面中,会需要要将Listview中的所有物品一键选中,一起结算,这时就要用到Listview的一键点击Item全部选中的功能了
我写的是一个简单的Demo 只有一个类,一个Adapter而已 所以比较适用于初学android 的来看。
下面这个是主页面的布局文件
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
android:id="@+id/line"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_below="@+id/tv"
android:orientation="horizontal">
android:id="@+id/bt_selectall"
android:layout_width="80dp"
android:layout_height="fill_parent"
android:text="全选"/>
android:id="@+id/bt_cancleselectall"
android:layout_width="80dp"
android:layout_height="fill_parent"
android:text="反选"/>
android:id="@+id/bt_deselectall"
android:layout_width="80dp"
android:layout_height="fill_parent"
android:text="取消选择"/>
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/line"/>
</RelativeLayout>
Listview中Item的布局文件
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
android:id="@+id/item_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"/>
android:id="@+id/item_cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="center_vertical"/>
</LinearLayout>
下面这些就是核心代码了 基本上本人都 有做一些注释的 有不明白可以看注释
packagesmile.itheima.com.listviewitemallcheck;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.Button;
importandroid.widget.LinearLayout;
importandroid.widget.ListView;
importandroid.widget.TextView;
importjava.util.ArrayList;
importbutterknife.BindView;
importbutterknife.ButterKnife;
importbutterknife.OnClick;
public classMainActivityextendsAppCompatActivity {
@BindView(R.id.tv)
TextViewmTv;
@BindView(R.id.line)
LinearLayoutmLine;
@BindView(R.id.bt_selectall)
ButtonmBtSelectall;
@BindView(R.id.bt_cancleselectall)
ButtonmBtCancleselectall;
@BindView(R.id.bt_deselectall)
ButtonmBtDeselectall;
@BindView(R.id.lv)
ListViewmLv;
private intcheckNum;// 记录选中的条目数量
privateTextViewtv_show;// 用于显示选中的条目数量
privateMyAdaptermAdapter;
privateArrayListmList;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// 为Adapter准备数据
initDate();
// 实例化自定义的MyAdapter
mAdapter=newMyAdapter(mList,this);
// 绑定Adapter
mLv.setAdapter(mAdapter);
}
//初始化数据
private voidinitDate() {
mList=newArrayList<>();
for(inti =0; i <15; i++) {
mList.add("data"+ i);
}
}
@OnClick({R.id.bt_selectall, R.id.bt_cancleselectall, R.id.bt_deselectall})
public voidonClick(View view) {
switch(view.getId()) {
caseR.id.bt_selectall:
//全选中
mBtSelectall.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
for(inti =0; i
MyAdapter.getIsSelected().put(i,true);
}
checkNum=mList.size();
//通知ListView进行刷新 并将这个方法进行抽取
datachanged();
}
});
break;
caseR.id.bt_cancleselectall:
//反选
mBtCancleselectall.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
for(inti =0; i
if(MyAdapter.getIsSelected().get(i)){
MyAdapter.getIsSelected().put(i,false);
checkNum--;
}else{
MyAdapter.getIsSelected().put(i,true);
checkNum++;
}
}
datachanged();
}
});
break;
caseR.id.bt_deselectall:
//取消选择
mBtDeselectall.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
for(inti =0; i
if(MyAdapter.getIsSelected().get(i)){
MyAdapter.getIsSelected().put(i,false);
checkNum--;
}
}
datachanged();
}
});
break;
}
mLv.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@Override
public voidonItemClick(AdapterView adapterView, View view,inti,longl) {
// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤
MyAdapter.ViewHolder holder= (MyAdapter.ViewHolder) view.getTag();
// 改变CheckBox的状态
holder.cb.toggle();
//将checkBox的状态记录下来
MyAdapter.getIsSelected().put(i, holder.cb.isChecked());
//调整选中的条目
if(holder.cb.isChecked()){
checkNum++;
}else{
checkNum--;
}
// 用TextView显示
// tv_show.setText("已选中" + checkNum + "项");
}
});
}
private voiddatachanged() {
// 通知listView刷新
mAdapter.notifyDataSetChanged();
// TextView显示最新的选中数目
// tv_show.setText("已选中" + checkNum + "项");
}
}
接下来是Adapter的书写了
packagesmile.itheima.com.listviewitemallcheck;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.CheckBox;
importandroid.widget.TextView;
importjava.util.ArrayList;
importjava.util.HashMap;
/**
* Created by albus on 2017/3/10.
*/
public classMyAdapterextendsBaseAdapter {
// 填充数据的list
privateArrayListmList;
// 用来控制CheckBox的选中状况
private staticHashMapisSelected;
// 上下文
privateContextmContext;
// 用来导入布局
privateLayoutInflaterinflater=null;
publicMyAdapter(ArrayList list, Context context) {
mList= list;
mContext= context;
inflater= LayoutInflater.from(context);
isSelected=newHashMap();
// 初始化数据
initDate();
}
// 初始化isSelected的数据
private voidinitDate() {
//初始化所有Item的选中状态 初始状态全部为false 未选中状态
for(inti =0; i
getIsSelected().put(i,false);
}
}
@Override
public intgetCount() {
returnmList.size();
}
@Override
publicObject getItem(inti) {
returnmList.get(i);
}
@Override
public longgetItemId(inti) {
returni;
}
@Override
publicView getView(inti, View convertView, ViewGroup viewGroup) {
ViewHolder holder =null;
if(convertView ==null) {
// 获得ViewHolder对象
holder =newViewHolder();
// 导入布局并赋值给convertview
convertView =inflater.inflate(R.layout.listview_item,null);
holder.tv= (TextView) convertView.findViewById(R.id.item_tv);
holder.cb= (CheckBox) convertView.findViewById(R.id.item_cb);
// 为view设置标签
convertView.setTag(holder);
}else{
// 取出holder
holder = (ViewHolder) convertView.getTag();
}
// 设置list中TextView的显示
holder.tv.setText(mList.get(i));
// 根据isSelected来设置checkbox的选中状况
holder.cb.setChecked(getIsSelected().get(i));
returnconvertView;
}
public staticHashMap getIsSelected() {
returnisSelected;
}
public static voidsetIsSelected(HashMap isSelected) {
MyAdapter.isSelected= isSelected;
}
public static classViewHolder {
TextViewtv;
CheckBoxcb;
}
}
有不懂的欢迎加QQ740894123 一起交流学习 本人正在向乞討在路上奔走中