文档章节

案例:ListView中checkbox错位问题

当空皓月
 当空皓月
发布于 2014/09/29 15:12
字数 433
阅读 571
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

Spring IOC 之 注册 BeanDefinition

获取 Document 对象后,会根据该对象和 Resource 资源对象调用 registerBeanDefinitions() 方法,开始注册 BeanDefinitions 首先调用 createBeanDefinitionDocumentReader() 方法实例化 Bean...

职业搬砖20年
20分钟前
1
0
Pycahrm左边出现一些bookmark的取消方法

pycharm 左边出一个对号或则一个0,放上去提示Bookmark 取消方法:按F11

鹏灬
23分钟前
0
0
JDK1.8使用Dubbo时需注意

Dubbo自带的很多包都比较旧了,其中的javassist在JDK1.8上运行会报错 而且错误通常比较诡异,javassist是编辑和创建Java字节码的类库,常见的错误会从spring中报出 解决办法: <dependency>...

火龙战士
25分钟前
1
0
Java 对Oracle数据库中的 BLOB类型 插入图片

package test;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.PrintStream;import java.sql.Connection;import java.sql.DriverManager;......

青峰Jun19er
28分钟前
0
0
awk复习

10月22日任务 复习 awk调用外部变量 -v参数设置内部变量调用外部变量 [root@test awk]# a=44[root@test awk]# echo "ABCD" | awk -v GET_A=$a '{print GET_A}'44 更复杂的应用: [root@...

robertt15
35分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部