您的位置:首页 > 移动开发 > Android开发

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

2016-11-04 01:04 134 查看
项目的最后就是显示截图记录,从一开始简单的在每个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐