一,创建一个Module
二,编写布局文件
(activity_main)
<?xml version="1.0" encoding="utf-8"?> <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.tangyu.oracle.multselect.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" android:visibility="gone" android:id="@+id/ll_select" > <ImageView android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center_vertical" android:src="@drawable/cb_n" android:id="@+id/iv_select_all"/> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="20dp" android:layout_marginLeft="20dp" android:id="@+id/btn_delete" android:text="删除"/> <Button android:layout_width="0dp" android:layout_marginLeft="20dp" android:layout_height="wrap_content" android:id="@+id/btn_cancel" android:layout_weight="1" android:text="返回"/> </LinearLayout> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lv_text"/> </LinearLayout>
这里注意的是android:visibility="gone"
这个属性
新建一个layout文件(item_main)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp"> <ImageView android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center_vertical" android:src="@drawable/cb_n" android:visibility="gone" android:id="@+id/iv_select_one"/> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/tv_msg" android:text="item" android:textSize="30sp" android:paddingLeft="30dp" android:gravity="center_vertical"/> </LinearLayout>
三,Java代码
现在准备好了布局文件,现在准备一个 实体类
在MainActivity同级目录下就好(Msg)
public class Msg { private int msgId; private String msg; private boolean isSelect; public Msg(int msgId, String msg) { this.msgId = msgId; this.msg = msg; } @Override public String toString() { return "Msg{" + "msgId=" + msgId + ", msg='" + msg + '\'' + ", isSelect=" + isSelect + '}'; } public int getMsgId() { return msgId; } public void setMsgId(int msgId) { this.msgId = msgId; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public boolean isSelect() { return isSelect; } public void setSelect(boolean select) { isSelect = select; } }
这里需要一个boolean的 isSelect是为了标记是否被选中,
现在,进入主要功能的实现,首先我们分析一下需要实现的功能,
1.肯定需要做ListView的按钮事件,如点击功能,长按进入能选中的状态,能删除选中的Item
(声明控件)
private ListView lv_select; private ImageView iv_select_all; private Button btn_delete,btn_cancel; private LinearLayout ll_select; private LinkedList<Msg> msgLinkedList; private MsgAdapter msgAdapter;
private boolean isDeleteMode; private boolean isSelectAll=true; private LVListener lVListener; private LVLongListener lvLongListener;
(绑定控件)
iv_select_all= (ImageView) findViewById(R.id.iv_select_all); lv_select= (ListView) findViewById(R.id.lv_text); ll_select= (LinearLayout) findViewById(R.id.ll_select); btn_delete= (Button) findViewById(R.id.btn_delete); btn_cancel= (Button) findViewById(R.id.btn_cancel);
(准备一个简单的List<Msg>)
msgLinkedList=new LinkedList<>(); for (int i = 0; i < 40; i++) { msgLinkedList.add(new Msg(i,"这是展示的内容"+i)); }
(准备Baseadapter)
// BaseAdapter适配器 public class MsgAdapter extends BaseAdapter{ @Override public int getCount() { return msgLinkedList.size(); } @Override public Object getItem(int i) { return msgLinkedList.get(i); } @Override public long getItemId(int i) { return msgLinkedList.get(i).getMsgId(); } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view==null){ view=getLayoutInflater().inflate(R.layout.item_main,null); viewHolder=new ViewHolder(); viewHolder.tv_text= (TextView) view.findViewById(R.id.tv_msg); viewHolder.iv_select_one= (ImageView) view.findViewById(R.id.iv_select_one); view.setTag(viewHolder); }else { viewHolder= (ViewHolder) view.getTag(); } Msg msg=msgLinkedList.get(i);
//这是为了标记item的点击事件是在界面点击,还是长按之后进入删除模式的时候的点击 if (isDeleteMode){ // 处于删除模式,显示选中图片 viewHolder.iv_select_one.setVisibility(View.VISIBLE); }else { // 处于非删除模式,不显示图片 viewHolder.iv_select_one.setVisibility(View.GONE); } //这是为了标记你的全选按钮是否被选中 if (isSelectAll){ // 处于全选模式,显示不被全选时的图片 iv_select_all.setImageResource(R.drawable.cb_n); }else { // 处于全选模式,显示被全选时的图片 iv_select_all.setImageResource(R.drawable.cb_c); } if (msg.isSelect()){ viewHolder.iv_select_one.setImageResource(R.drawable.cb_c); }else { viewHolder.iv_select_one.setImageResource(R.drawable.cb_n); } viewHolder.tv_text.setText(msg.getMsg()); return view; } } // 持有者 private class ViewHolder{ TextView tv_text; ImageView iv_select_one,iv_select_all; }
准备完了,现在需要实现其中的功能了,
按钮的点击事件
BtnListener btnListener = new BtnListener();
btn_cancel.setOnClickListener(btnListener);
btn_delete.setOnClickListener(btnListener);
iv_select_all.setOnClickListener(btnListener);
我们需要写一个内部类来继承OnClickListener
private class BtnListener implements View.OnClickListener{ @Override public void onClick(View view) { switch (view.getId()){ // 取消 case R.id.btn_cancel: ll_select.setVisibility(View.GONE); isDeleteMode=false; isSelectAll=true; for (Msg msg:msgLinkedList ) { msg.setSelect(false); } iv_select_all.setImageResource(R.drawable.cb_n); lv_select.setOnItemClickListener(lVListener); break; // 删除 case R.id.btn_delete: for (int i = 0; i < msgLinkedList.size(); i++) { if (msgLinkedList.get(i).isSelect()) { msgLinkedList.remove(i); i--; } } break; // 全选 case R.id.iv_select_all: if(isSelectAll){ for (int i = 0; i < msgLinkedList.size(); i++) { msgLinkedList.get(i).setSelect(true); } isSelectAll = false; }else{ for (int i = 0; i < msgLinkedList.size(); i++) { msgLinkedList.get(i).setSelect(false); } isSelectAll = true; } break; } msgAdapter.notifyDataSetChanged(); } }
item的长按事件
lVListener=new LVListener();
lv_select.setOnItemClickListener(lVListener);
lvLongListener=new LVLongListener();
// 全选图片的点击事件
lv_select.setOnItemLongClickListener(lvLongListener);
写一个内部类来继承OnItemLongClickListener
private class LVLongListener implements AdapterView.OnItemLongClickListener{ @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { // 显示两个按钮 ll_select.setVisibility(View.VISIBLE); // 改变当前的模式为删除模式 isDeleteMode=true; // 选中当前长按的item msgLinkedList.get(i).setSelect(true); // 通知适配器刷新数据 msgAdapter.notifyDataSetChanged(); return true; } }
item的点击事件
// lv_select的点击事件 private class LVListener implements AdapterView.OnItemClickListener{ @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { if (isDeleteMode){ msgLinkedList.get(i).setSelect(!msgLinkedList.get(i).isSelect()); // 判断操作item时,是否被全部选中,通过全部选中的情况来判断顶部iv_select_all是否变化 boolean selectAll=true; msgAdapter.notifyDataSetChanged(); for (int j = 0; j < msgLinkedList.size(); j++) { if (!msgLinkedList.get(j).isSelect()){ selectAll=false; break; } } isSelectAll=(selectAll?false:true); }else { Toast.makeText(MainActivity.this, msgLinkedList.get(i).getMsg(), Toast.LENGTH_SHORT).show(); } } }
这样,这个小module其实已经完成了