ListView滚动内容显示重复的问题

今天在做项目的时候,发现ListView的显示出问题了,具体情况是这样的:ListView上的每个item显示的是每个用户的信息,当在滑动ListView后,出现了其他的用户信息显示在不是属于他的item上的BUG,经过网上查找相关信息后,原因是出在getView这个方法里,因为重复利用convertView导致的结果,下面是代码:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder;
        if (convertView == null) {
            View v = LayoutInflater.from(context).inflate(
                    R.layout.listview_item, null);
            viewHolder = new ViewHolder();
            viewHolder.txtname = (TextView) v.findViewById(R.id.txtname);
            viewHolder.imgremoteicon = (ImageView) v.findViewById(R.id.imgremoteicon);
            viewHolder.txtsignature = (TextView) v.findViewById(R.id.txtsignature);
       viewHolder.txtlatesttime = (TextView) v.findViewById(R.id.txtlatesttime);
            v.setTag(viewHolder);
            convertView = v;
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (list != null) {
            final PeopleModel mPeopleModel = list.get(position);
            if (mPeopleModel != null) {
                Log.e(TAG, "icons=" + mPeopleModel.icon);
                if (!TextUtils.isEmpty(mPeopleModel.icon)) {
                    ImageLoader.getInstance().displayImage(mPeopleModel.icon, viewHolder.imgremoteicon, options,animateFirstListener);
                }       
                if (!TextUtils.isEmpty(mPeopleModel.username)) {
                    viewHolder.txtname.setText(mPeopleModel.username);
                }

                if (!TextUtils.isEmpty(mPeopleModel.sign)) {
                    viewHolder.txtsignature.setText(mPeopleModel.sign);
                } 

              viewHolder.txtlatesttime.setText(DateUtil.getLatestLoginTime(
                        (long) mPeopleModel.last_update, context));

        }
        return convertView;
    }

那么问题来了,当不滑动ListView是没有问题的,因为一开始convertView是为空,在构建convertView的时候就会创建一个ViewHoler对象且这个对象里面没有任何数据,并将这个对象通过setTag设置进去,通过这个对象为convertView的各个控件赋值,当ListView向下滑动时,最上面的item不可见,最下面出现了一个新的item,这个时候并不会再构建一个convertView,而是用了之前构建好的convertView,并通过getTag得到ViewHolder对象,这个时候ViewHolder对象里面是有数据的,当程序执行到新的item出现,adapter要为convertView各个控件赋值,但当有的控件需要对数据加以判断后才能赋值,例如上面的代码,当条件不满足时就会跳过对这个控件的赋值,但是前面的某一个item上的这个控件是有赋值的,所以这个新的item就会使用原来缓存的convertView中的值,这就造成了在新的item出现后,会出现视图重复的问题.

所以解决的办法就是,对于不满足条件就不能赋值的控件加上一个else语句,给定一个默认值,所以在上面的代码中在if判断完后加个else对控件赋值,就解决了我目前的BUG.

这是我的第一篇博客,希望能在这里记录自己学习上的点点滴滴,也希望能在这里有所收获,有所成长.

时间: 2024-10-10 14:01:31

ListView滚动内容显示重复的问题的相关文章

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

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

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滑动过程中图片显示重复错位闪烁问题解决[转载]

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

angular 数据内容有重复时不显示问题

<body ng-app="app"> <div ng-controller="myctl"> <ul> <li ng-repeat="item in arr"> {{item}} </li> </ul> </div> <script> angular.module("app", []).controller("myctl

listview中的item重复问题

Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件. 1.为了防止拖动ListView时,在列表末尾重复数据显示.需要加入 HashMap<Integer,View> lmap = new HashMap<Integer,View>();其中Integer为列表位置,View为子项视图,加入数据前首先if (lmap.get(position)==null) ,满足条件时,加入lmap.put(position, convertView

通用Adapter与ListView滚动时不加载图片的封装

本文原创,转载请注明链接:http://blog.kymjs.com/ 在Android开发中写Adapter是一件非常麻烦的事情,枯燥重复,却又不得不去做. 对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder存储,其实大部分的代码都是类似的.那么本文就带大家一起做一次将Adapter封装成一个通用的Adapter. 关于本文的完整Demo,可以参考KJFrameForAndroid开发框架2.2版本中封装的实例,KJAdapter和Ada

ScrollView内嵌套ListView时的显示与滑动问题

最近的项目中遇到了SrcollView内嵌ListView的需求,要求ListView内容全部展示,但是实际效果ListView却只显示了一行,一开始以为是代码异常了,只生成了一行视图,实际上就是SrcollView和ListView的冲突问题.解决办法就是禁止ListView的滑动. 一.自定ListView,其实就是包了一层处理而已,很简单. package com.hundsun.bridge.view; import android.content.Context; import and

Android 记录和恢复ListView滚动的位置的三种方法

本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变. 有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下. 1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScroll

Android实现查询数据库,把数据库内容显示到屏幕

首先,是布局文件,非常的简单,一个可以滑动的ScrollView包裹一个线性布局,线性布局里面无内容 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_he