Android Listview显示混乱问题

在使用自定义ListView视图时,经常会采用重用ListView中视图的方式来提高滑动和显示效率,但是随之而来的一个问题是listview中数据经常显示混乱。

通常情况下,我们重写的方法是这样的:

inflater = LayoutInflater.from(context);

@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
      convertView = inflater.inflate(R.layout.book_item, null);
      holder = new ViewHolder(convertView);
      Book book = books.get(position);
      holder.bookName.setText(book.getName());
      holder.bookTime.setText(book.getTime());
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
  }

  class ViewHolder {
    ImageView bookPic;
    TextView bookName;
    TextView bookTime;

    public ViewHolder(View view) {
      bookPic = (ImageView) view.findViewById(R.id.iv_book_pic);
      bookName = (TextView) view.findViewById(R.id.tv_book_name);
      bookTime = (TextView) view.findViewById(R.id.tv_book_time);
    }
  }

这样通常会造成list显示混乱,是因为当我们重用视图但是convertView != null的时候我们并没有去重新加载数据,写成下面这种形式就会重新加载数据了:

@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
      convertView = inflater.inflate(R.layout.book_item, null);
      holder = new ViewHolder(convertView);
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }
    Book book = books.get(position);//不管视图是否重用,都重新设置数据
    holder.bookName.setText(book.getName());
    holder.bookTime.setText(book.getTime());
    return convertView;
  }
时间: 2024-08-06 03:04:16

Android Listview显示混乱问题的相关文章

Android ListView显示访问WebServices返回的JSON结果

1.WebServices的返回结果 2.ListView内容布局代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_heigh

Android ListView显示倒计时的流畅实现

有人在群里问他实现的倒计时在ListView中很卡,有没有好的方案,我就闲来没事,实现了一下,供参考 package com.microchange; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.microchange.view.TimeView; import com.microchange.view.applicati

.Net程序员玩转Android开发---(12)ListView显示数据

Android中显示数据有多种控件,这节我们来认识下ListView,ListView是Android中最常用的数据显示控件,可以显示简单数据源,也可以显示复杂数据源,我们在Android系统中常看到的列表项,基本都是ListView的功劳.ListView中显示数据,肯定要绑定数据源.数据源的绑定是通过Adapter来完成的,Android中有两种常用的适配器,ArrayAdapter(数组适配器)  SimpleAdapter(简单适配器),适配器的作用就是把复杂的数据源显示到istview

android listView 的最后一个item显示(菜鸟新手,老鸟勿喷)

问题:一个listView显示不满全屏时,最后一个item会自动占满剩下的屏幕高度,而我们需要看到的是每个item布局所要占的高度一样. 解决办法:主要是把ListView布局里面的高度设置为:android:layout_height="fill_parent" : listView显示的每个item就占同样的高度了.

Android 自定义 ListView 显示网络歌曲列表

本文内容 环境 项目结构 演示自定义 ListView 显示网络歌曲列表 参考资料 本文最开始看的一个国人的文章,没有源代码,根据文中提供的源代码,自己新建的项目(最可气的是,没有图标图片资源,只能自己乱编),但程序不是很稳定,有时能显示出列表中的缩略图,有时显示不出来,还在主线程访问了网络.后看文章评论,作者给出英文原文链接,本来想这下没事了吧,结果下载源代码运行后,还是有问题~仔细看英文原文,原来他也是根据 Github 上一个项目的基础上搞的,只是添加了式样,以及显示完整的歌曲列表,包括歌

Android ListView滑动过程中图片显示重复错乱闪烁问题解决

转自:http://www.oschina.net/question/221817_121051 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则p

android listview 不显示选中效果分析

android listview有时会发现没有选中效果,解决办法 1:listview布局中设置颜色,如 android:background="@android:color/white" 2:在listview的item布局文件中背景设置为 android:background="@android:color/transparent" 原因:颜色设置在整体的listview上面,每一行布局设置透明色即可 android listview 不显示选中效果分析

Android ListView滑动过程中控件显示重复/错误问题之原理分析及解决方案

前言: 为了使ListView性能更优,最普遍的方法就是添加一个ViewHolder静态类. 虽然性能有很大的提高,但是同样也伴随着Item控件内容显示重复或错乱的情况. 分析并解决如下两个问题 一.控件数据未初始化而导致的显示错误. 二.网络异步加载导致出现显示错误.重复. 如下我们来简单分析一下ListView的缓存机制.我们整篇文章均以下图的模型来举例说明. (图片转至http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.h

Android ListView滑动过程中图片显示重复错位闪烁问题解决[转载]

转自:here 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存:b. 获取滑入屏幕的行item之前会先判断缓存中是否有可