`

ListView 隔行重复选中的问题

 
阅读更多

转载;

 

http://blog.sina.com.cn/s/blog_713953c5010123k6.html

 

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)来取,这样既可以保存改变的状态,又不会重复。

分享到:
评论

相关推荐

    VB ListView 隔行变色

    为了确保颜色变化的正确性,开发者还需要考虑一些细节问题,比如ListView的视图模式(不同视图可能需要不同的处理方式),以及颜色的兼容性(确保颜色在各种背景下都具有良好的可读性)。此外,如果ListView有复选框...

    android表格效果之ListView隔行变色实现代码

    在Android开发中,为了提升用户界面的视觉效果和可读性,经常会在表格视图,如ListView中实现隔行变色的功能。这个功能使得用户在浏览列表时更容易区分不同的行,提高了阅读体验。本篇文章将详细讲解如何在Android中...

    android实现listview隔行颜色不同

    为了提高用户体验,我们经常需要对ListView的每一项进行个性化设计,比如隔行显示不同的颜色。本篇将详细介绍如何通过继承`SimpleAdapter`来实现这个功能。 首先,我们要理解`SimpleAdapter`的作用。它是Android ...

    listview隔行着色

    "listview隔行着色"是指在ListView中实现交替行颜色显示,通常是为了提高用户体验,使用户更容易区分不同的列表项。这一功能在很多应用中都能见到,如邮件应用、通讯录等。 要实现ListView隔行着色,主要涉及以下...

    ListView默认Item选中状态

    ListView的默认行为是不设置任何项为选中状态,但有时我们希望在应用启动时,第一个Item能自动呈现出选中效果,以引导用户或者突出初始焦点。本教程将深入讲解如何实现ListView的第一个Item的默认选中状态。 首先,...

    listview滑动保存选中状态

    然而,在实际应用中,我们经常遇到一个问题:当用户在ListView中滚动时,选中的条目(item)的CheckBox状态无法保持,即“listview滑动保存选中状态”。这个问题主要是由于ListView的复用机制导致的,为了解决这一...

    ListView隔行显示

    本文将深入探讨如何实现ListView的隔行显示效果,以及在实际应用中可能遇到的单元格绑定问题。 首先,让我们来理解“隔行显示”这个概念。在ListView中,隔行显示通常指的是通过改变奇偶行的背景颜色或者样式,使得...

    ListView嵌套ListView带多选,全选,反选,选中数量

    嵌套ListView可能导致性能问题,因为每个ListView都需要绘制自己的内容。可以通过使用ViewHolder模式减少视图的创建和查找,以及在适配器中缓存已计算过的视图高度来提高性能。 10. **保存和恢复选择状态**: 当...

    ListView保留item选中效果

    以上是实现ListView选中效果保留的一些常用方法。实际开发中,应根据项目需求选择合适的方式。同时,优化ListView的滚动性能也非常重要,避免在getView()方法中进行耗时操作,以保证用户体验流畅。

    C#之ListView的最佳理解

    - **选择和焦点**:`ListView.SelectedItems`集合包含当前被选中的项,`ListView.FocusedItem`表示具有焦点的项。 3. **ListView事件** - **ItemClick**:当用户点击项时触发,可用于实现点击项后的操作。 - **...

    Android中listView选中第一行,或任意一行,选中后能取消

    总结起来,实现ListView选中第一行或任意一行并能取消选中的关键步骤包括: 1. 实现`OnItemClickListener`监听器。 2. 在点击事件中改变选中项的背景色,并记录选中位置。 3. 在新的项被点击时,取消之前选中的项。 ...

    listview item选中删除,全选,取消

    "listview item选中删除,全选,取消"这个主题涉及到ListView中的多选操作、删除功能以及全选和取消全选的实现。接下来,我们将深入探讨这些知识点。 1. 多选模式(Multiple Choice Mode): 在ListView中,为了...

    ListView选中行高亮

    "ListView选中行高亮"这个话题,就是关于如何实现这个功能的技术要点。 首先,我们来理解一下ListView的基本工作原理。ListView通过Adapter(适配器)来绑定数据源,将数据转化为可显示的View,然后利用View的复用...

    listview数据重复解决办法

    然而,在实际操作中,开发者经常遇到一个问题,那就是ListView的数据重复显示,以及Item的ID错乱问题。这两个问题可能会严重影响用户体验,甚至导致程序逻辑错误。下面我们将深入探讨这个问题,并提供有效的解决策略...

    控件重绘 C# WinForm控件美化扩展系列之ListView

    此外,为了实现动态效果,比如悬停时高亮或选中时的特殊样式,我们可以处理ListView的各种事件,如MouseEnter、MouseLeave和ItemSelectionChanged。在这些事件的处理器中,根据当前状态更新控件的外观。 在...

    ListView被选中 出现选中颜色标示

    标题"ListView被选中 出现选中颜色标示"所描述的问题,正是关于如何在ListView中实现这种选中效果,即在项被点击后显示选中颜色。这里我们将深入探讨如何在Android中为ListView添加选中颜色标识,并提供一种实现方法...

    ListView选中item颜色改变

    "ListView选中item颜色改变"是常见的需求,它涉及到ListView的交互设计,使得用户可以通过视觉反馈感知到所选中的条目。本篇文章将深入探讨如何实现这个功能。 首先,我们需要了解ListView的基本工作原理。ListView...

    哥们“十年”发的ListView避免重复、状态保存的代码

    在实际开发中,我们常常会遇到两个问题:一是如何避免ListView中的项重复显示,二是如何在Activity重建时(如屏幕旋转)保存ListView的状态。这篇博客"哥们“十年”发的ListView避免重复、状态保存的代码"提供了一些...

    winfrom 隔行换色

    在Windows Forms(WinForms)开发中,隔行换色是一种常见的设计技巧,它可以使用户界面更加清晰、易于阅读。在表格或列表展示大量数据时,通过改变奇偶行的背景颜色,可以显著提高用户对数据的辨识度。本文将详细...

    安卓ListView选中状态

    本篇将详细介绍如何实现“安卓ListView选中状态”以及如何在其上添加背景颜色。 首先,我们需要理解ListView的工作原理。ListView通过Adapter类来绑定数据源,Adapter会将数据转化为View显示在列表中。每个View代表...

Global site tag (gtag.js) - Google Analytics