標籤:listview checkbox button 滑動刪除 選擇刪除
在項目開發過程中,常常需要對使用者列表的資訊進行刪除的操作。Android中常用的刪除操作方式有兩種 ,一種就是類似的滑動出現刪除按鈕方式,還有一種是通過CheckBox進行選擇,然後通過按鈕進行刪除的方式。本來的執行個體整合上述的兩種操作方式來實現使用者列表刪除的效果。
設計思路:在適配器類MyAdapter一個滑動刪除按鈕顯示或隱藏的Map,一個用於CheckBox是否選中的Map和一個與MainAcitivyt進行資料互動的介面ContentsDeleteListener,同時該介面包含兩個方法,contentsDeleteSelect(int position, boolean isChecked)方法用於將選中或取消內容從選中List中加入或刪除,contentDelete(int position)用於刪除List中指定位置的列項。滑動的效果主要是通過當滑動的距離大於40時,顯示滑動刪除按鈕,再執行刪除操作時,將其他所有設定不可見,並設定CheckBox為不選中狀態。
一.代碼實現效果
二.代碼實現
1. 主介面布局 activity_main.xml
<span style="font-size:18px;"><RelativeLayout 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" > <Button android:id="@+id/my_delete_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="@string/delete" /> <ListView android:id="@+id/my_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_above="@id/my_delete_btn" android:contentDescription="@string/member_list"/></RelativeLayout></span>
主介面布局很簡單,就一個刪除Button和一個存放使用者資訊的ListView
2.使用者項布局 activity_main_list_view.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_rl" android:layout_width="match_parent" android:layout_height="200dp" > <CheckBox android:id="@+id/my_select_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:background="@drawable/my_list_checkbox_selector" android:button="@null" /> <TextView android:id="@+id/my_content_tv" android:layout_width="wrap_content" android:layout_height="60dp" android:layout_centerInParent="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/my_select_cb" android:gravity="center" android:text="@string/delete" /> <TextView android:id="@+id/my_delete_tv" android:layout_width="80dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerInParent="true" android:layout_marginLeft="5dp" android:clickable="true" android:drawableLeft="@drawable/del_icon_normal" android:gravity="center" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="@string/delete" android:visibility="gone" /></RelativeLayout></span>
該布局包含一個選擇的CheckBox,顯示內容的TextView 和一個能滑動實現刪除的TextView
3.滑動效果anim_right_left.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromXDelta="320" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="0" /></set></span>
4.CheckBox選取器 my_list_checekbox_selector.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/my_list_check_box_bg_check" android:state_checked="true"></item> <item android:drawable="@drawable/my_list_check_box_bg_check" android:state_selected="true"></item> <item android:drawable="@drawable/my_list_check_box_bg_check" android:state_pressed="true"></item> <item android:drawable="@drawable/my_list__check_box_bg"></item> </selector></span>
5.使用者列表適配器 MyAdapter.java
<span style="font-size:18px;">package com.example.slideandselectdeletedemo;import java.util.HashMap;import java.util.List;import java.util.Map;import android.annotation.SuppressLint;import android.content.Context;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.RelativeLayout;import android.widget.TextView;import com.example.slidedeleteandselectdemo.R;@SuppressLint("UseSparseArrays")public class MyAdapter extends BaseAdapter {private LayoutInflater mInflater;private List<String> mContentsList;private Context mContext;private ContentsDeleteListener mContentsDeleteListener;//設定滑動刪除按鈕是否顯示private Map<Integer, Integer> visibleDeleteTv;//CheckBox選擇和未選擇private Map<Integer, Boolean> selectCb;//滑動後的X座標點private int mLastX = 0;//private int mLastY = 0;public MyAdapter(Context mContext, List<String> mContentsList,ContentsDeleteListener mContentsDeleteListener) {this.mContext = mContext;this.mContentsList = mContentsList;this.mContentsDeleteListener = mContentsDeleteListener;this.mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);visibleDeleteTv = new HashMap<Integer, Integer>();selectCb = new HashMap<Integer, Boolean>();// 更新介面時,記錄為 未選中和滑動刪除按鈕不可見 for (int i = 0; i < mContentsList.size(); i++) {visibleDeleteTv.put(i, View.GONE);selectCb.put(i, false);}}public void updateView(List<String> mContentsList) {this.mContentsList = mContentsList;this.notifyDataSetChanged();}@Overridepublic int getCount() {return mContentsList.size();}@Overridepublic Object getItem(int position) {return mContentsList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {final HolderView holderView;if (convertView == null) {holderView = new HolderView();convertView = mInflater.inflate(R.layout.activity_main_list_view,null);holderView.listSelectCb = (CheckBox) convertView.findViewById(R.id.my_select_cb);holderView.listContentTv = (TextView) convertView.findViewById(R.id.my_content_tv);holderView.listDeleteTv = (TextView) convertView.findViewById(R.id.my_delete_tv);holderView.listRl = (RelativeLayout) convertView.findViewById(R.id.my_rl);convertView.setTag(holderView);} else {holderView = (HolderView) convertView.getTag();if (holderView.listSelectCb.isChecked()) {holderView.listSelectCb.setChecked(false);}}// 顯示內容holderView.listContentTv.setText(mContentsList.get(position));if (visibleDeleteTv != null) {holderView.listDeleteTv.setVisibility(visibleDeleteTv.get(position));}if (selectCb != null) {holderView.listSelectCb.setChecked(selectCb.get(position));mContentsDeleteListener.contentsDeleteSelect(position,selectCb.get(position));}// 處理選擇事件holderView.listRl.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (visibleDeleteTv.containsValue(View.VISIBLE)) {//可見時,再次單擊設定不可見,未選中for (int i = 0; i < getCount(); i++) {visibleDeleteTv.put(i, View.GONE);selectCb.put(i, false);mContentsDeleteListener.contentsDeleteSelect(i, false);}notifyDataSetChanged();} else {boolean isChecked = holderView.listSelectCb.isChecked() ? false: true;holderView.listSelectCb.setChecked(isChecked);mContentsDeleteListener.contentsDeleteSelect(position, isChecked);}}});holderView.listSelectCb.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {mContentsDeleteListener.contentsDeleteSelect(position,isChecked);}});holderView.listSelectCb.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (visibleDeleteTv.containsValue(View.VISIBLE)) {for (int i = 0; i < getCount(); i++) {visibleDeleteTv.put(i, View.GONE);selectCb.put(i, false);mContentsDeleteListener.contentsDeleteSelect(i, false);}notifyDataSetChanged();}}});convertView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {final Animation alpha = AnimationUtils.loadAnimation(mContext,R.anim.anim_right_left);int x = (int) event.getX();//int y = (int) event.getY();// Log.d(TAG, "x=" + x + " y=" + y);// press downif (event.getAction() == MotionEvent.ACTION_DOWN) {alpha.cancel();} else if (event.getAction() == MotionEvent.ACTION_MOVE) {alpha.cancel();int deltaX = mLastX - x;//int deltaY = mLastY - y;// Log.d(TAG, "deltaX=" + deltaX + ",deltaY=" + deltaY);if (deltaX > 40) {//當滑動距離大於40時,顯示該位置的刪除按鍵for (int i = 0; i < getCount(); i++) {visibleDeleteTv.put(i, View.GONE);selectCb.put(i, false);mContentsDeleteListener.contentsDeleteSelect(i, false);if (i == position) {visibleDeleteTv.put(position, View.VISIBLE);selectCb.put(i, true);mContentsDeleteListener.contentsDeleteSelect(i, true);if (visibleDeleteTv.get(position) == View.VISIBLE) {holderView.listDeleteTv.startAnimation(alpha);}}}notifyDataSetChanged();}return true;} else {// otheralpha.cancel();}mLastX = x;//mLastY = y;return false;}});holderView.listDeleteTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// Log.d(TAG, "onClick:position=" + position);mContentsList.remove(position);mContentsDeleteListener.contentDelete(position);for (int i = 0; i < mContentsList.size(); i++) {visibleDeleteTv.put(i, View.GONE);selectCb.put(i, false);mContentsDeleteListener.contentsDeleteSelect(i, false);}notifyDataSetChanged();}});return convertView;}public class HolderView {public TextView listContentTv, listDeleteTv;public CheckBox listSelectCb;public RelativeLayout listRl;}public void setContentsDeleteListener(ContentsDeleteListener mContentsDeleteListener) {this.mContentsDeleteListener = mContentsDeleteListener;}/** * 用於刪除內容的介面 * * @author liangming.deng * */public interface ContentsDeleteListener {/** * 根據isChecked 選擇和取消選擇的指定位置 * @param position * @param isChecked */public void contentsDeleteSelect(int position, boolean isChecked);/** * 刪除指定位置內容 * @param position */public void contentDelete(int position);}public void setVisibleDeleteTv(Map<Integer, Integer> visibleDeleteTv) {this.visibleDeleteTv = visibleDeleteTv;}public void setSelectCb(Map<Integer, Boolean> selectCb) {this.selectCb = selectCb;}}</span>
5.主介面代碼MainActivity.java
<span style="font-size:18px;">package com.example.slideandselectdeletedemo;import java.util.ArrayList;import java.util.Collections;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ListView;import com.example.slideandselectdeletedemo.MyAdapter.ContentsDeleteListener;import com.example.slidedeleteandselectdemo.R;public class MainActivity extends Activity implements ContentsDeleteListener,OnClickListener{private ListView myLv;private Button myDeleteBtn;private MyAdapter myAdapter;private String[] myContentsArray;private List<String> myContentsList = new ArrayList<String>();private List<String> mySelectedList = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findById();myContentsArray = this.getResources().getStringArray(R.array.my_contents);if(myContentsArray != null){Collections.addAll(myContentsList, myContentsArray);}myAdapter = new MyAdapter(this,myContentsList,this);myLv.setAdapter(myAdapter);}private void findById(){myLv = (ListView) this.findViewById(R.id.my_lv);myDeleteBtn = (Button) this.findViewById(R.id.my_delete_btn);myDeleteBtn.setOnClickListener(this);}@Overridepublic void onResume(){super.onResume();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}/* * 根據isChecked,給選擇的List中添加或刪除資料 * (non-Javadoc) * @see com.example.slideandselectdeletedemo.MyAdapter.ContentsDeleteListener#contentsDeleteSelect(int, boolean) */@Overridepublic void contentsDeleteSelect(int position,boolean isChecked) {if(isChecked){mySelectedList.add(myContentsList.get(position));}else{mySelectedList.remove(myContentsList.get(position));}}/* * 刪除指定位置的資料 * (non-Javadoc) * @see com.example.slideandselectdeletedemo.MyAdapter.ContentsDeleteListener#contentDelete(int) */@Overridepublic void contentDelete(int position) {// TODO Auto-generated method stubmyContentsList.remove(position);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.my_delete_btn:myContentsList.removeAll(mySelectedList);myAdapter.updateView(myContentsList);break;}}}</span>
分析:其中mySelectedList主要用於儲存CheckBox選中的列表資訊。方便刪除按鈕進行選中的全部刪除。
上述主要部分給出了注釋。
源碼地址:http://download.csdn.net/detail/a123demi/7751141