国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中ListView綁定CheckBox實現(xiàn)全選增加和刪除功能(DEMO)

2019-12-12 05:27:36
字體:
供稿:網(wǎng)友

ListView控件還是挺復雜的,也是項目中應該算是比較常用的了,所以寫了一個小Demo來講講,主要是自定義adapter的用法,加了很多的判斷等等等等….我們先來看看實現(xiàn)的效果吧!

這里寫圖片描述

好的,我們新建一個項目LvCheckBox

這里寫圖片描述

我們事先先把這兩個布局寫好吧,一個是主布局,還有一個listview的item.xml,相信不用多說

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#238286" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="ListView綁定CheckBox"android:textColor="#fff" /><TextViewandroid:id="@+id/tv_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="17dp"android:text="增加"android:textColor="#fff" /></RelativeLayout><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ></ListView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal" ><Buttonandroid:id="@+id/btn_detele"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginRight="1dp"android:layout_weight="1"android:background="#238286"android:text="刪除"android:textColor="#fff" /><Buttonandroid:id="@+id/btn_select_all"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="1dp"android:layout_weight="1"android:background="#238286"android:text="全選"android:textColor="#fff" /></LinearLayout></LinearLayout>

item.xml

<?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="50dp"android:gravity="center_vertical"android:orientation="horizontal" ><TextViewandroid:id="@+id/tvTitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_weight="7"android:text="text" /><CheckBoxandroid:id="@+id/cbCheckBox"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1" /></LinearLayout>

item.xml只有兩個控件,很好理解吧

初始化控件

我們用initView()方法來初始化這些控件

private void initView() {tv_add = (TextView) findViewById(R.id.tv_add);tv_add.setOnClickListener(this);btn_detele = (Button) findViewById(R.id.btn_detele);btn_detele.setOnClickListener(this);btn_select_all = (Button) findViewById(R.id.btn_select_all);btn_select_all.setOnClickListener(this);listview = (ListView) findViewById(R.id.listview);}

然后繼承點擊事件,button的和listview的

implements OnClickListener,OnItemClickListener

自定義Adapter

這里最難的就是adapter了

1.Bean

我們?yōu)榱藬?shù)據(jù)的記錄方便,我們提前寫一個實體類

package com.lgl.lvcheckbox;public class Bean {private String title;// 構造方法public Bean(String title) {super();this.title = title;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}

ListAdapter

這里所有的都寫了注釋,也方便大家看清

package com.lgl.lvcheckbox;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.TextView;/*** 自定義適配器* * @author LGL**/public class ListAdapter extends BaseAdapter {// 數(shù)據(jù)集private List<Bean> list = new ArrayList<Bean>();// 上下文private Context mContext;// 存儲勾選框狀態(tài)的map集合private Map<Integer, Boolean> isCheck = new HashMap<Integer, Boolean>();// 構造方法public ListAdapter(Context mContext) {super();this.mContext = mContext;// 默認為不選中initCheck(false);}// 初始化map集合public void initCheck(boolean flag) {// map集合的數(shù)量和list的數(shù)量是一致的for (int i = 0; i < list.size(); i++) {// 設置默認的顯示isCheck.put(i, flag);}}// 設置數(shù)據(jù)public void setData(List<Bean> data) {this.list = data;}// 添加數(shù)據(jù)public void addData(Bean bean) {// 下標 數(shù)據(jù)list.add(0, bean);}@Overridepublic int getCount() {// TODO Auto-generated method stub// 如果為null就返回一個0return list != null ? list.size() : 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;View view = null;// 判斷是不是第一次進來if (convertView == null) {view = LayoutInflater.from(mContext).inflate(R.layout.item, null);viewHolder = new ViewHolder();viewHolder.title = (TextView) view.findViewById(R.id.tvTitle);viewHolder.cbCheckBox = (CheckBox) view.findViewById(R.id.cbCheckBox);// 標記,可以復用view.setTag(viewHolder);} else {view = convertView;// 直接拿過來用viewHolder = (ViewHolder) view.getTag();}// 拿到對象Bean bean = list.get(position);// 填充數(shù)據(jù)viewHolder.title.setText(bean.getTitle().toString());// 勾選框的點擊事件viewHolder.cbCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {// 用map集合保存isCheck.put(position, isChecked);}});// 設置狀態(tài)if (isCheck.get(position) == null) {isCheck.put(position, false);}viewHolder.cbCheckBox.setChecked(isCheck.get(position));return view;}// 優(yōu)化public static class ViewHolder {public TextView title;public CheckBox cbCheckBox;}// 全選按鈕獲取狀態(tài)public Map<Integer, Boolean> getMap() {// 返回狀態(tài)return isCheck;}// 刪除一個數(shù)據(jù)public void removeData(int position) {list.remove(position);}}

當然,有些方法是后面寫的,我們提前寫好,比如刪除和增加什么的

初始化數(shù)據(jù)

我們默認總是需要點數(shù)據(jù)的

private void initData() {// 默認顯示的數(shù)據(jù)List<Bean> list = new ArrayList<Bean>();list.add(new Bean("張三"));list.add(new Bean("李四"));list.add(new Bean("王五"));adapter = new ListAdapter(this);adapter.setData(list);listview.setAdapter(adapter);}

增加數(shù)據(jù)

// 添加數(shù)據(jù)case R.id.tv_add:adapter.addData(new Bean("劉桂林"));// 通知刷新適配器adapter.notifyDataSetChanged();break;

全選數(shù)據(jù)

當我們?nèi)x的時候,按鈕應該為全不選的,所以這里我們這里有狀態(tài)的

case R.id.btn_select_all:// 全選――全不選Map<Integer, Boolean> isCheck = adapter.getMap();if (btn_select_all.getText().equals("全選")) {adapter.initCheck(true);// 通知刷新適配器adapter.notifyDataSetChanged();btn_select_all.setText("全不選");btn_select_all.setTextColor(Color.YELLOW);} else if (btn_select_all.getText().equals("全不選")) {adapter.initCheck(false);// 通知刷新適配器adapter.notifyDataSetChanged();btn_select_all.setText("全選");btn_select_all.setTextColor(Color.YELLOW);}break;

刪除數(shù)據(jù)

刪除也是要考慮很多因素

// 刪除數(shù)據(jù)case R.id.btn_detele:// 拿到所有數(shù)據(jù)Map<Integer, Boolean> isCheck_delete = adapter.getMap();// 獲取到條目數(shù)量,map.size = list.size,所以int count = adapter.getCount();// 遍歷for (int i = 0; i < count; i++) {// 刪除有兩個map和list都要刪除 ,計算方式int position = i - (count - adapter.getCount());// 判斷狀態(tài) true為刪除if (isCheck_delete.get(i) != null && isCheck_delete.get(i)) {// listview刪除數(shù)據(jù)isCheck_delete.remove(i);adapter.removeData(position);}}btn_select_all.setText("全選");btn_select_all.setTextColor(Color.WHITE);adapter.notifyDataSetChanged();break;

這里的

int position = i - (count - adapter.getCount());

是一個計算方式,當我們刪除之后,實際上數(shù)組是需要重新排列的,同時按鈕也要變回全選狀態(tài)的

這里寫圖片描述

listview的點擊

我們直接點擊也是可以勾選cheakbox選中的// listview的點擊事件@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// 判斷view是否相同if (view.getTag() instanceof ViewHolder) {// 如果是的話,重用ViewHolder holder = (ViewHolder) view.getTag();// 自動觸發(fā)holder.cbCheckBox.toggle();}}

以上所述是小編給大家介紹的Android中ListView綁定CheckBox實現(xiàn)全選增加和刪除功能(DEMO),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 北票市| 隆化县| 海门市| 沁源县| 万荣县| 墨江| 华亭县| 新乡市| 平凉市| 会东县| 新建县| 防城港市| 砚山县| 天全县| 清镇市| 贵溪市| 连城县| 曲水县| 文成县| 镇宁| 芜湖县| 靖边县| 随州市| 嘉义县| 屏南县| 鄢陵县| 嘉鱼县| 理塘县| 凤山市| 杂多县| 福清市| 弋阳县| 油尖旺区| 连南| 类乌齐县| 丹阳市| 东莞市| 新宾| 仙居县| 凌源市| 锡林浩特市|