`
huobengluantiao8
  • 浏览: 1077321 次
文章分类
社区版块
存档分类
最新评论

Android ListView中item view重复使用带来的问题

 
阅读更多

Android ListView中item view重复使用带来的问题

本文主要介绍ListView中item view的重复使用、可能带来的出错情况以及解决方案

1、为什么item View重复使用及如何重复使用

熟悉ListView的朋友都知道,在ListView的每个item需要花较大的时间进行渲染(比如需要网络获取数据、图片)时,为了使得ListView能够平滑的上下滑动,需要对listView的adapter做一些性能优化,比如数据(图片)异步加载、重复使用item的view

其中item的重复使用代码如下

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	if (convertView == null && context != null) {
		convertView = inflater.inflate(R.layout.list_activity, null);
	}
	……
}

可以发现上面主要通过判断convertView若不为空进行重复使用,节省资源加载和创建的时间。然后这种重用之前的convertView会对当前的显示有一定影响

2、可能出错情况

a、convertView包含TextView

之前的convertView会显示某个textView,但当前我并不需要显示了没有问题,而因为重用会导致仍会显示。

b、convertView包含ImageView,且异步设置ImageView中ImageResource时的问题

调试adapter的getView函数就会发现,头3个item都是重用第1个item的,所以若异步修改第2和第3个item的imageView第1个也会被修改,导致第1个item的imageView不断闪烁

我的补充:

这种情况发生的原因是因为ListView没办法确定它一次需要实例化多少个convertView,即调用多少次getView方法。而导致这样的结果可能有以下原因:

1、你自己重写的ListView在实例化以后直接使用,而没有给它指定高度和宽度。

2、将ListView布局在xml中高度值指定为了Wrap_Content

3、将ListView布局到一个父组件,ListView本身的height是fillParent,但是父类组件在其父组件中高度为Wrap_Content 等

如:

         .....省略以上
         android:id="@+id/all"
            />
        
    </RelativeLayout>

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <ListView 
             android:layout_width="fill_parent"
        	android:layout_height="fill_parent"
            ></ListView>
    </LinearLayout>

</LinearLayout>


c、convertView包含TextView,且异步设置 TextView中图片时的问题

在textView中使用setCompoundDrawablesWithIntrinsicBounds添加图片,若第3个item 的textView异步添加了图片,第1个也会相应被加上

具体原因还没debug出来,暂时的解决方法有两个

3、解决方案

a、正确性优先,去除性能优化 ===== 我不大赞成,以上所有的出错方案都可以通过调整逻辑来达到理想效果并且保持性能

即不再重用convertView,每次重新赋值

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	convertView = inflater.inflate(R.layout.list_activity, null);
	……
}

b、初始化每个Item View中的出错元素

比如对于可能出错情况a的解决如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	if (convertView == null && inflater != null) {
		convertView = inflater.inflate(R.layout.status_activity, parent, false);
	}
	
	TextView tx = (TextView)convertView.findViewById(R.id.contentTextView);
	if (contentList.get(position) == null) {
		tx.setVisibility(View.GONE);
	} else {
		……
	}
}

其中if (contentList.get(position) == null) 即表示消除之前的convertView的影响。

其他元素初始设置类似,如ImageView的ImageResource。

这种方法对于很多View需要初始化时较麻烦,若出错view太多还是使用第一种解决方案方便些,毕竟很多时候性能不会那么差。

分享到:
评论

相关推荐

    Android ListView 中item的左右滑动动画效果的实现

    公司有个项目要用到类似手机QQ聊天记录列表ListView左右滑动后改变item的效果,网上没找到好的代码,偶然在安卓巴士的开源站http://d.apkbus.com/里面找到了SwipeToDismiss的源码...改成自己的显示另一个view的效果就行...

    android listview item背景色点击效果实例

    在Android中,ListView的每个项(item)都是一个View或ViewGroup,通常我们通过自定义布局文件来设计每个item的显示样式。为了实现点击效果,我们可以使用两种主要方法: 1. **自定义Adapter**: 在自定义的...

    Android ListVIew 拖动Item 删除

    本篇将详细介绍如何在Android中实现在ListView中拖动并删除Item。 首先,我们需要创建一个自定义的ListView,这个ListView需要能够识别用户的触摸事件,并处理拖动操作。在Android中,我们可以通过重写onTouchEvent...

    Android ListView 不同类型item展示

    在提供的`AppHomeProject`项目中,开发者可能已经实现了类似的功能,展示了如何在ListView中使用不同类型的item。通过对该项目的源码分析,我们可以更深入地理解这一技术,包括数据结构的设计、Adapter的实现细节...

    android listview item 拖动排序

    在这个主题中,我们将深入探讨如何在Android中实现ListView的拖动排序功能,以及`DragSortListView`库的使用方法。 `DragSortListView`是一个开源的Android库,它扩展了原生的ListView,增加了拖放排序的能力。这个...

    android ListView Item展开效果

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。然而,仅使用基本的ListView有时无法满足复杂的交互需求,例如,我们可能需要在ListView的每一项(Item)上实现点击后展开子项的效果。这就...

    Android 为ListView每个Item上面的按钮添加事件

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在这个场景中,我们需要为ListView的每个Item中的按钮添加点击事件,并且在按钮被点击时能够获取到对应Item中的TextView的文本信息。以下是对...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    当调用getView()方法时,根据数据创建或复用一个View,并在这个View中添加子ListView。 子ListView的Adapter则需要处理其自身的数据源,这可能是一个简单的数组或者更复杂的对象列表。在子ListView的Adapter中,...

    关于listview item重用导致图片重复加载 图片重新请求

    综上所述,解决ListView中图片重复加载的关键在于正确使用图片加载库,如Android-Universal-Image-Loader,通过合理的缓存策略和管理图片加载生命周期,确保图片只加载一次,并在item重用时正确显示。这不仅可以提高...

    Android ListView 可拖拽Item 1 - 创建浮动Item

    本篇将详细介绍如何在Android中创建一个可拖拽Item的ListView,具体步骤如下: 首先,我们需要了解基本的ListView工作原理。ListView通过Adapter来绑定数据源,并通过ViewHolder优化视图复用,提高性能。在创建可...

    android 两组listview中item互换

    每个数据项通常由一个自定义的`View`或`ViewGroup`(如`LinearLayout`或`RelativeLayout`)表示,这些`View`或`ViewGroup`称为`ListView`的`Adapter`中的`Item`。 要实现两组`ListView`中`Item`的互换,我们需要...

    android listview item 左右滑动

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。然而,为了提供更好的用户体验,开发者经常需要扩展ListView的功能,例如实现左右滑动的效果。这个功能通常被用于实现快速删除或者展示更多的...

    android ListView 动态添加删除

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。动态添加和删除ListView中的Item是一项常见的功能,尤其在构建需要用户交互的应用时。本文将深入探讨如何实现这个需求,以及涉及到的关键...

    Android ListView左右滑动删除Item效果

    在Android开发中,ListView是常用的数据展示组件,用于显示...通过以上步骤,你就可以在Android应用中实现一个左右滑动删除ListView Item的效果了。这不仅可以提高用户交互体验,也能为你的应用增添一份独特的魅力。

    ListView默认Item选中状态

    通过以上步骤,我们就可以在Android应用中实现ListView的第一个Item的默认选中状态,并且在用户交互时动态改变选中状态。记住,优化性能也是关键,合理利用ViewHolder和避免不必要的操作是提升ListView滚动流畅性的...

    Android ListView边框圆角美化

    ListView是由多个View(通常是ListView项布局,即Item Layout)组成的,这些View在用户滚动时被重用以优化性能。因此,要实现圆角效果,我们需要修改每个ListView项的布局。 1. **自定义ListView项布局**:创建一个...

    Android ListView使用技巧

    在Android开发中,ListView是应用界面设计中非常常见的一种组件,尤其在展示大量数据时,它的高效滚动性能和可复用视图机制使其成为开发者首选。本篇文章将深入探讨几个关键的Android ListView使用技巧,帮助你提升...

    Android listview item高亮显示

    在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。当用户在搜索框输入关键字后,我们通常希望在ListView中突出显示匹配的关键字,以便用户能够快速找到相关条目。这个“Android listview item高亮...

    android 修改listview的不同item字体的颜色

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要根据需求定制ListView,比如改变不同列表项(item)的字体颜色。标题"android 修改listview的不同item字体的颜色...

    android listView中item项的显示与隐藏动画实现

    在Android开发中,ListView是常用的数据展示控件,它可以有效地展示大量数据并提供滚动操作。在ListView中,我们经常需要对item项进行一些定制化的显示和隐藏效果,以提升用户体验。本篇将深入探讨如何在ListView中...

Global site tag (gtag.js) - Google Analytics