项目尾声(ListView+CheckBox进行批量删除)
2016-11-04 01:04
134 查看
项目的最后就是显示截图记录,从一开始简单的在每个item右侧添加一个CheckBox的方式,改成了长按 某行item,每个item的CheckBox才显现出来,并且显现底部菜单栏进行编辑。
为了满足需求,需要重新订制Adapter,以下是我编写的Adapter的源码
下面来解释一下我的做法
1、实现CheckBox的隐藏和显现
核心代码是以下:
首先选择hashmap是因为其特性,键是唯一的不可重复,我这里将每个item的位置position做为键,就可以对应每个item,
然后在对map进行初始化,否则map为空会引起空指针,
最后就是通过position获取显示状态。
2、获取CheckBox被选中的item
这个和显示类似,核心代码如下:
也用一个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
为了满足需求,需要重新订制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
相关文章推荐
- ListView长按Item显示CheckBox并进行批量删除操作
- gae利用checkbox进行批量删除 JS常用代码:五行搞定checkbox全选/全不选
- Android项目技术总结:主界面中ListView装载数据并结合手势进行翻页
- listView进行CheckBox的全选、反选
- Flex中利用CheckBox对DataGrid控件中的项目进行过滤的例子
- 给ListView的Item添加CheckBox,长按调出CheckBox,然后通过点击进行选中和取消
- listview+checkbox选择多条项目并获取内容
- Android 中使用ListView和CheckBox进行批量操作
- Android项目:模仿ConvertView原理(ListView的getView方法)对View对象进行回收和复用
- Android电话短信拦截项目总结之 checkbox和listview抢焦点
- 使用xutil建新建项目,并保存到listView中进行显示
- Android项目技术总结:主界面中ListView装载数据并结合手势进行翻页
- android项目 之 来电管家(2) ----- ListView+CheckBox的使用
- ListView的CheckBox状态的保存及项目中会出现的奇怪情况
- ListView中添加CheckBox,进行多项选择,全选,反选,完美无Bug
- 记录我项目中遇到的问题-----listview itme双击事件与CheckBox冲突事件处理
- Listview嵌套CheckBOX 实现全选反选取消,并对选中项进行标记
- Android项目:模仿ConvertView原理(ListView的getView方法)对View对象进行回收和复用 推荐
- 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)
- Flex中利用CheckBox对DataGrid控件中的项目进行过滤的例子