項目尾聲(ListView+CheckBox進行批量刪除)

項目的最後就是顯示截圖記錄,從一開始簡單的在每個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章