案例:ListView中checkbox错位问题
案例:ListView中checkbox错位问题
当空皓月 发表于3年前
案例:ListView中checkbox错位问题
  • 发表于 3年前
  • 阅读 559
  • 收藏 3
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

1、使用viewHolder后出现重复

1、现象
   ListView中,当前点击的那行,设置为红色。往下滚动,发现隔11行或12行的那行也会变红色,但是你并没有点过它。
2、原因
  主要的问题在于自定义的Adapter中的getView()方法。一般我们会这样写:
    public View getView(int position, View convertView, ViewGroup parent) { 
        ZuJian zuJian = null; 
        if(convertView==null){ 
            zuJian = new ZuJian(); 
            // 获取组件布局 
            convertView = layoutInflater.inflate(R.layout.vlist2, null); 
            zuJian.imageView = (ImageView) convertView.findViewById(R.id.image); 
            zuJian.titleView = (TextView) convertView.findViewById(R.id.title); 
            zuJian.infoView = (TextView) convertView.findViewById(R.id.info); 
            zuJian.button = (Button) convertView.findViewById(R.id.view_btn); 
            // 这里要注意,是使用的tag来存储数据的。 
            convertView.setTag(zuJian); 
        } 
        else { 
            zuJian = (ZuJian) convertView.getTag(); 
        } 
   }
这样写的话,就会有问题了。因为我们知道View convertView只在第一页显示的那些item是被创建的,
当你滚动到下一页的时候,就会重复使用,这时候就会出问题。
3、解决办法
    HashMap<Integer,View> lmap = new HashMap<Integer,View>();
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        ViewHolder holder = null;
        
        if (lmap.get(position) == null) {            
            view = mInflater.inflate(R.layout.download_productdetail_item, null);
            holder = new ViewHolder();
            holder.txt_bookChapter = (TextView) view
                .findViewById(R.id.download_book_name);
            final int p = position;
            lmap.put(position, view);
            view.setTag(holder);
        }else{
            view = lmap.get(position);
            holder = (ViewHolder)view.getTag();
        }
   }
在这段代码中,我们可以看到一开始定义了一个HashMap<Integer,View> lmap,在getView()方法中,
使用lmap.put(position, view)把每个view和position一一对应起来,对于已经建立的view,
使用view = lmap.get(position)来取,这样既可以保存改变的状态,又不会重复。

原文地址:http://www.eoeandroid.com/thread-208179-1-1.html?_dsign=98bbb545

扩展:

如果我们用的是ExpandableListView呢?该怎么解决呢?

import android.graphics.Point;
private Map<Point, View> checkedMap = new HashMap<>();
@override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
     if (checkedMap.get(new Point(groupPosition, childPosition)) == null) {
          .......
          checkedMap.put(new Point(groupPosition, childPosition), convertView);
          convertView.setTag(mViewHolder);
     }else{
          convertView = checkedMap.get(new Point(groupPosition, childPosition));
          mViewHolder = (ViewHolder) convertView.getTag();
      }
      .......
}

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 13
博文 176
码字总数 65862
×
当空皓月
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: