欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络网盘之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"));
}