文档章节

案例:ListView中checkbox错位问题

当空皓月
 当空皓月
发布于 2014/09/29 15:12
字数 433
阅读 570
收藏 3

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
博文 179
码字总数 67070
作品 0
郑州
Android 冷门知识点,适合刚入门开发者

1.命名空间 xmlns:android="http://schemas.android.com/apk/res/android的作用 这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么是对的,什么是错...

天方月圆
2017/11/06
0
0
Android ListView 使用

一.ListView点击变色 1.selector_text.xml listview——item中textview字体颜色改变 2.selector.xml listview——点击背景颜色改变 3.xml中设置 4.代码中设置 5.备注 android:state_selected...

SRain215
2016/03/16
144
0
通过重写Adapter实现多选的ListView

下面这个是需要现实在ListView中的布局文件: 这个文件是Activity的布局文件:

鉴客
2011/09/25
516
1
android中如何获得listview中的checkbox的值?

大概情景:在做一个文件浏览器。listview显示所有的文件。如果是文件,点击打开。如果是文件夹,递归显示目录下的文件。 遇到的问题:通过listview和checkbox实现批量删除。checkbox初始状态...

苏谷子
2013/01/28
2.3K
4
关于Struts2标签显示的问题

近用SSH2开发一个系统,在用到struts2 <s:checkbox >标签是发生了错位现象。如下图: 然后,我在<td><s:checkbox label="ischecked" name="checked" value="false" /></td>中添加代码 theme=......

Jerikc
2012/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
36分钟前
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
47分钟前
0
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
0
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部