网络网盘之ListView 的(CheckBox )滑动问题
程序员文章站
2022-06-17 18:54:21
...
Android网盘开发最不可避免的就是在ListView 中关于CheckBox 滑动问题
这与ListView 的缓存机制有关。。
问题: 你不断的上下滑动,CheckBox勾中项就会混乱,即跑到别的item中
上网搜了很多资料,(大同小异)解决这一问题。
而我做这个网络网盘就用了给传入进来的List<Map<String,Object>> mData 设置标志
也就是在item被点击是记录被点击的position
// 如果是文件夹则打开
if ((Integer) (mData.get(position).get("icon")) == R.drawable.icon_folder) {mDir = (String) mData.get(position).get("info");
mData = getData(); // 点击目录时进入子目录
MyAdapter adapter = new MyAdapter(getApplicationContext(),mData);
list.setAdapter(adapter);
tv_path.setText("目前路径:" + mDir);
} else {
CheckBox check = ((MyAdapter.ViewHolder) view.getTag()).checkbox;
if (check.isChecked()) { // 判断CheckBox是否选择
// ,如果是则取消并修改mData中上传为false
check.setChecked(false);
mData.get(position).remove("isUpload");
mData.get(position).put("checkTag", false);
// 记录文件是否被点击 标记为上传
mData.get(position).put("isUpload", "NO");
} else {
check.setChecked(true);
mData.get(position).remove("isUpload");
mData.get(position).put("checkTag", true);
mData.get(position).put("isUpload", "YES");
}
}
上面的checkTag是关键,设置点击的表示,在初始化时,给每个item,设置checkTag,false , 也就是Map<String, Object>对象。
而在Adapter(extends BaseAdapter) 就很简单了,设置标记值,这样每一个mData在position上都有明确的checkTag值,记录你是否点击过
if (String.valueOf(mData.get(position).get("isUpload")).equals("YES")) {
// 如果是 则checkbox显示为Checked
// 防止listview缓存机制导致CheckBox是否选中错乱
holder.checkbox.setChecked((Boolean)
mData.get(position).get("checkTag"));
} else {
holder.checkbox.setChecked( (Boolean)
mData.get(position).get("checkTag"));
}