项目尾声(ListView+CheckBox进行批量删除)

来源:互联网 发布:百度地图api php开发 编辑:程序博客网 时间:2024/06/07 05:46

项目的最后就是显示截图记录,从一开始简单的在每个item右侧添加一个CheckBox的方式,改成了长按 某行item,每个item的CheckBox才显现出来,并且显现底部菜单栏进行编辑。

为了满足需求,需要重新订制Adapter,以下是我编写的Adapter的源码

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.TextView;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;public class MyAdapter extends BaseAdapter {    private List<File> mData;    private LayoutInflater mInflater;    private Context context;    private ViewHolder viewHolder;    private HashMap<Integer, Integer> isVisibleMap;// 用来控制CheckBox的显示状况    private HashMap<Integer, Boolean> isCheckMap;//用来控制CheckBox的选择状况    public MyAdapter(Context context,List<File> mData){        this.context=context;        this.mInflater=LayoutInflater.from(context);        this.mData=mData;        isVisibleMap=new HashMap<>();        isCheckMap=new HashMap<>();        initDate();    }    @Override    public int getCount() {        int number = 0;        if (mData!= null) {number = mData.size();}        return number;    }    @Override    public Object getItem(int position) {        return null!=mData.get(position)?mData.get(position):null;    }    @Override    public long getItemId(int position) {        return position;    }    // 初始化isSelectedMap的数据    private void initDate() {        for (int i = 0; i < mData.size(); i++) {            getIsVisibleMap().put(i,CheckBox.GONE);            getIsCheckMap().put(i,false);        }    }    public HashMap<Integer, Integer> getIsVisibleMap() {        return isVisibleMap;    }    public HashMap<Integer,Boolean> getIsCheckMap(){        return isCheckMap;    }    private class ViewHolder{        private TextView fileName;        private TextView modifyName;        private CheckBox checkBox;    }    @Override    @SuppressWarnings("ResourceType")    public View getView(final int position, View convertView, ViewGroup parent) {        final File file= (File) getItem(position);        if(convertView==null){            convertView=mInflater.inflate(R.layout.pic_list_view,null);            viewHolder=new ViewHolder();            viewHolder.fileName= (TextView) convertView.findViewById(R.id.tvFileName);            viewHolder.modifyName= (TextView) convertView.findViewById(R.id.tvModifyTime);            viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.the_checkbox);            final ViewHolder finalViewHolder=viewHolder;            viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {                @Override                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    int radiaoId = (int) finalViewHolder.checkBox.getTag();                    if(isChecked)                    {                        //将选中的放入hashmap中                        isCheckMap.put(radiaoId, true);                    }else {                        isCheckMap.put(radiaoId,false);                    }                }            });            convertView.setTag(viewHolder);            viewHolder.checkBox.setTag(position);        }else {            viewHolder= (ViewHolder) convertView.getTag();            viewHolder.checkBox.setVisibility(getIsVisibleMap().get(position));            viewHolder.checkBox.setTag(position);        }        viewHolder.fileName.setText(file.getName());        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");        String time=simpleDateFormat.format(new Date(file.lastModified()));        viewHolder.modifyName.setText(time);        //找到需要选中的条目        if(isCheckMap!=null && isCheckMap.containsKey(position))        {            viewHolder.checkBox.setChecked(isCheckMap.get(position));        }        else        {            viewHolder.checkBox.setChecked(false);        }        return convertView;    }}

下面来解释一下我的做法
1、实现CheckBox的隐藏和显现
核心代码是以下:

private HashMap<Integer, Integer> isVisibleMap;// 用来控制CheckBox的显示状况// 初始化isSelectedMap的数据    private void initDate() {        for (int i = 0; i < mData.size(); i++) {            getIsVisibleMap().put(i,CheckBox.GONE);            getIsCheckMap().put(i,false);        }    } viewHolder.checkBox.setVisibility(getIsVisibleMap().get(position));

首先选择hashmap是因为其特性,键是唯一的不可重复,我这里将每个item的位置position做为键,就可以对应每个item,
然后在对map进行初始化,否则map为空会引起空指针,
最后就是通过position获取显示状态。
2、获取CheckBox被选中的item
这个和显示类似,核心代码如下:

private HashMap<Integer, Boolean> isCheckMap;viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {                @Override                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    int radiaoId = (int) finalViewHolder.checkBox.getTag();                    if(isChecked)                    {                        //将选中的放入hashmap中                        isCheckMap.put(radiaoId, true);                    }else {                        isCheckMap.put(radiaoId,false);                    }                }            });//找到需要选中的条目        if(isCheckMap!=null && isCheckMap.containsKey(position))        {            viewHolder.checkBox.setChecked(isCheckMap.get(position));        }        else        {            viewHolder.checkBox.setChecked(false);        }

也用一个hashmap来控制选中状态,监听CheckBox的选中改变事件,然后分类进行赋值,其实上面两个if代码块可以不用进行判断。
第一个直接就isCheckMap.put(radiaoId, isChecked);
第二个的判断更是多余,直接viewHolder.checkBox.setChecked(isCheckMap.get(position))即可。
解决CheckBox错乱的方法就是viewHolder.checkBox.setTag(position);
没错我是对当前位置进行保存,然后通过getTag()的方法赋值给radiaoId,就不会错乱了。

总结
实现就是这么简单,两个hashmap解决,至于长按之后出现菜单诸如全选、删除、撤销等只是简单的逻辑问题,可以参考一下我的全部源码
地址:https://github.com/YougeView/myTestSignal

0 0
原创粉丝点击