當(dāng)我們?cè)趯懮坛茿pp時(shí),在購(gòu)物車這個(gè)頁(yè)面中逐样,會(huì)需要要將Listview中的所有物品一鍵選中蜗字,一起結(jié)算,這時(shí)就要用到Listview的一鍵點(diǎn)擊Item全部選中的功能了
? ? ? ?我寫的是一個(gè)簡(jiǎn)單的Demo ? ? ?只有一個(gè)類脂新,一個(gè)Adapter而已 ?所以比較適用于初學(xué)android 的來(lái)看挪捕。
下面這個(gè)是主頁(yè)面的布局文件
<?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;// 記錄選中的條目數(shù)量
privateTextViewtv_show;// 用于顯示選中的條目數(shù)量
privateMyAdaptermAdapter;
privateArrayListmList;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// 為Adapter準(zhǔn)備數(shù)據(jù)
initDate();
// 實(shí)例化自定義的MyAdapter
mAdapter=newMyAdapter(mList,this);
// 綁定Adapter
mLv.setAdapter(mAdapter);
}
//初始化數(shù)據(jù)
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進(jìn)行刷新? 并將這個(gè)方法進(jìn)行抽取
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對(duì)象,這樣就省去了通過(guò)層層的findViewById去實(shí)例化我們需要的cb實(shí)例的步驟
MyAdapter.ViewHolder holder= (MyAdapter.ViewHolder) view.getTag();
// 改變CheckBox的狀態(tài)
holder.cb.toggle();
//將checkBox的狀態(tài)記錄下來(lái)
MyAdapter.getIsSelected().put(i, holder.cb.isChecked());
//調(diào)整選中的條目
if(holder.cb.isChecked()){
checkNum++;
}else{
checkNum--;
}
// 用TextView顯示
//? tv_show.setText("已選中" + checkNum + "項(xiàng)");
}
});
}
private voiddatachanged() {
// 通知listView刷新
mAdapter.notifyDataSetChanged();
// TextView顯示最新的選中數(shù)目
// tv_show.setText("已選中" + checkNum + "項(xiàng)");
}
}
接下來(lái)是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 {
// 填充數(shù)據(jù)的list
privateArrayListmList;
// 用來(lái)控制CheckBox的選中狀況
private staticHashMapisSelected;
// 上下文
privateContextmContext;
// 用來(lái)導(dǎo)入布局
privateLayoutInflaterinflater=null;
publicMyAdapter(ArrayList list, Context context) {
mList= list;
mContext= context;
inflater= LayoutInflater.from(context);
isSelected=newHashMap();
// 初始化數(shù)據(jù)
initDate();
}
// 初始化isSelected的數(shù)據(jù)
private voidinitDate() {
//初始化所有Item的選中狀態(tài)? ? ? ? 初始狀態(tài)全部為false? 未選中狀態(tài)
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對(duì)象
holder =newViewHolder();
// 導(dǎo)入布局并賦值給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設(shè)置標(biāo)簽
convertView.setTag(holder);
}else{
// 取出holder
holder = (ViewHolder) convertView.getTag();
}
// 設(shè)置list中TextView的顯示
holder.tv.setText(mList.get(i));
// 根據(jù)isSelected來(lái)設(shè)置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? 一起交流學(xué)習(xí)? 本人正在向乞討在路上奔走中