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