android studio用BaseAdapter做一个全选/取消全选的小项目

一,创建一个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其实已经完成了



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值