2 dinikinmi dinikinmi 于 2015.06.02 01:48 提问

Android ListView重复加载的问题

我建立一个 ListViewView,并重写了自己的 adapter(继承BaseAdapter),数据源是一个ArrayList.
,ArrayList里的数据是 1,2,3。当我初始化 ListView时,显示的是 1,2,3。
以上看起来非常正常,但当我按 后退键,然后重新 进入 ListView的时候,诡异的事情就发生了。。
当我第二次进入 ListView的时候,屏幕上显示的 数据 成了 1,2,3, 1,2,3 .
然后我按下 后退键,再进入 ListView, 屏幕上的 数据 成了 1,2,3, 1,2,3 ,1,2,3

如此循环往复。。总之,每次进入ListView,都得重新读取ArrayList的数据。请问是什么原因导致的呢?
以下是adapter源码
public class chatListAdapter extends BaseAdapter{

private Context context;                        //运行上下文   
private List<Map<String, Object>> listItems;    //联系人信息集合   
private LayoutInflater listContainer;           //视图容器   
private boolean[] hasChecked;                   //记录联系人选中状态   
public final class ListItemView{                //自定义控件集合     


        public TextView RemoteAudio;
        public TextView LocalAudio;
        public TextView RemoteId;     
        public TextView LocalId;
        public TextView MessageType;

        public ImageView RemoteImage;
        public ImageView LocalImage;
        public TextView RemoteSay;
        public TextView LocalSay;

 }     
public chatListAdapter(Context context, List<Map<String, Object>> listItems) {   
    Log.v("construtor", "constructor11");
    this.context = context;            
    listContainer = LayoutInflater.from(context);   //创建视图容器并设置上下文   
    this.listItems = listItems;   
    hasChecked = new boolean[getCount()];   
}   



@Override
public int getCount() {
    // TODO Auto-generated method stub
    return listItems.size();


}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

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


    // TODO Auto-generated method stub
    Log.v("getview","getview11");
    final int selectID = position;
    ListItemView  listItemView = null;  
     listItemView = new ListItemView();  
    if (convertView == null) {   

        //获取list_item布局文件的视图   
        convertView = listContainer.inflate(R.layout.chat_list_item, null);   
        //获取控件对象   
        listItemView.RemoteAudio = (TextView)convertView.findViewById(R.id.RemoteAudio); 
        listItemView.LocalAudio = (TextView)convertView.findViewById(R.id.LocalAudio);   
        listItemView.RemoteId = (TextView)convertView.findViewById(R.id.RemoteId); 
        listItemView.LocalId = (TextView)convertView.findViewById(R.id.LocalId);
        listItemView.MessageType= (TextView)convertView.findViewById(R.id.MessageType);   
        listItemView.RemoteImage = (ImageView)convertView.findViewById(R.id.RemoteImage);
        listItemView.LocalImage=(ImageView)convertView.findViewById(R.id.RemoteImage);
        listItemView.RemoteSay=(TextView)convertView.findViewById(R.id.RemoteSay);
        listItemView.LocalSay=(TextView)convertView.findViewById(R.id.LocalSay);
        //设置控件集到convertView   
        convertView.setTag(listItemView);  
    }else{listItemView=(ListItemView)convertView.getTag();}

        //set rma,lca,mst,rid,lid into invisible
        //put data from list into view
        String strPosition=""+position;

        int RR=0;
        RR++;
        Log.v("11aa21","RR"+RR);

        listItemView.RemoteId.setText((String)listItems.get(position).get("RemoteId"));

// String idd=Regist.generateId();
// listItemView.RemoteId.setText(" "+idd+" ");
Log.v("11aa21","PositionI"+strPosition);
Log.v("RemoteID","Remote+"+(String)listItems.get(position).get("RemoteId"));

        listItemView.LocalId.setText((String) listItems.get(position).get("LocalId"));
        Log.v("11aa21","PositionI"+strPosition);
        Log.v("RemoteID","LocalID+"+(String)listItems.get(position).get("LocalId"));


        ////
        listItemView.RemoteAudio.setText((String)listItems.get(position).get("RemoteAudio"));
        listItemView.LocalAudio.setText((String)listItems.get(position).get("LocalAudio"));
        ////
        listItemView.MessageType.setText((String)listItems.get(position).get("MessageType"));
        ///
        listItemView.RemoteImage.setBackgroundResource(R.drawable.ic_launcher);
        listItemView.LocalImage.setBackgroundResource(R.drawable.ic_launcher);
        ///
        listItemView.RemoteSay.setText((String)listItems.get(position).get("RemoteSay"));
        listItemView.LocalSay.setText((String)listItems.get(position).get("LocalSay"));

// String idd=Regist.generateId();
// listItemView.LocalSay.setText(idd);
// listItemView.RemoteSay.setText("rms"+position);

        Log.i("tttt","ttttt"+listItemView.LocalSay.getText().toString());
        //decide wether Ls,LI,RS,RI invisible
        //if msgtype=??,then set..invisible,set XX onclick method=??
        String MsgType=listItemView.MessageType.getText().toString();
        Log.i("msgt",MsgType);

        if (MsgType.equals("9d")){
            Log.v("MsgType", "Text");
        listItemView.LocalSay.setVisibility(View.INVISIBLE);
        listItemView.LocalImage.setVisibility(View.INVISIBLE);
        listItemView.RemoteSay.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.v("1ab",((TextView) v).getText().toString());
                Toast.makeText(null, "111",Toast.LENGTH_LONG).show();
            }
        });
        }

    return convertView;
}

}

6个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.06.02 09:20
已采纳

看你数据源的ArrayList,是不是静态变量,而且每次初始化的时候都没有clear。

bdmh
bdmh   Ds   Rxr 2015.06.02 05:02

估计是你的7数据源里面数据重复了,打个断点,看看数据源里有多少数据

91program
91program   Ds   Rxr 2015.06.02 07:22

看你创建数据源的代码吗,可能重复创建了,但是创建前又没有清空之前的数据

dinikinmi
dinikinmi   2015.06.02 11:36

谢谢各位的回答,根据 danielibiti兄的答案,我找到了原因。
ArrayList是static,而我加载之前又没有clear,所以导致放进内存的map堆积在一起。。
加了clear后,问题解决了。。非常感谢各位的指点 :)

dinikinmi
dinikinmi   2015.06.02 11:40

谢谢各位的回答,大家的答案都非常接近真相。我也不知道该采纳谁,而dan先生提到static,我认为对于我这种菜鸟而言比较容易理解。。。so。就采纳了。。。还是非常感谢大家,为这个问题,我熬两晚通宵了

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.06.02 11:44

static,,看了之后,我觉得也好理解诶

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ListView加载混乱以及getView重复调用问题
1:因为复用item造成数据混乱 解决方法:http://www.trinea.cn/android/android-listview-display-error-image-when-scroll/ 主要方式是:设置holder的tag,记得是在设置完convertView之后设置holder的tag 2:getView被多次调用 https://www.liaohu
ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法
今天在项目中遇到了一个问题,我的主页Activity是以ViewPager+Fragment进行构建的,其中有两个Fragment又包含了ListView,正常情况下这两个Fragment的界面如下: 但是当我从主页Activity跳转到另一个Activity,之后再返回主页Activity时,发现第一个包含ListView的Fragment的界面变成了下面这样: 很明显这是ListVi
解决listView数据重复加载
import java.util.ArrayList; import java.util.HashMap; import com.gta.virtualsimulation.R; import com.gta.virtualsimulation.entity.EvaluationBean; import android.content.Context; import android.view.
Imageloader 加载listview 头像 闪动,重复加载等问题的解决方案之一
android Imageloader 加载 listview 的时候,你的头像还在闪动么? 调研了一些方法,网上好多人都说给imgview.settag(),新手的我并不知道改之后处理,如果有大神,麻烦您赐教一下下,今天找到了一个新方法,原理与imgView.setTag()一样,都是直接设置本地已经保存的图片,就是在设置option的时候,加上.diaplayer(new SimpltDisp
android listview 异步加载图片并防止错位及解决ListView滚动后内容重复的问题
关于Llistview加载图片出现图片错乱,闪烁,复用等问题
android listview 数据加载错乱、错位、重复
前言:android的listview,写吐了的东西,尤其它的适配器,当遇上相对复杂的场景的时候,还是容易出问题的,例如listview嵌套listview这样的场景、对item中子控件频繁的做一些操作等,可能会遇到数据加载错乱、错位等问题。其实这个时候,你怎么加断点加log打印都是没用的,你会发现数据都是正常的。正文:首先必须要明白listview的工作原理:android为了优化listview
安卓listview照片重复显示解决办法
类似游戏资讯的一个小项目效果图:listview页面点击listview页面的item进入详细页面1----------首先粘贴异步请求图片并处理的类  AsyncImageLoader类public class AsyncImageLoader { private HashMap&amp;lt;String, SoftReference&amp;lt;Drawable&amp;gt;&amp;gt; imageCache; ...
Android Universal Image Loader加载 ListView 滑动过程中图片显示重复错位闪烁问题
项目使用uil加载listview图片时,出现过一次头像加载错了的问题, 之后在一篇博客上看到一种解决方案,可以借鉴 http://www.trinea.cn/android/android-listview-display-error-image-when-scroll/ 另外还尝试了另外一种方法,就是随便写一个图片地址,好像也可以,没有具体的去测试,欢迎拍砖
listView异步加载图片导致图片错位、闪烁、重复的问题的解决
androidListView是android中重要的控件,几乎每一个项目都会用到。但是在使用中我们避免不了会出现一些问题,包括一些滑动事件的处理,例如:ListView中嵌套scrollView,容易出现listView展现数据不全的问题,还有就是listView中我们在加载图片的时候出现图片在加载中出现加载出来的图片出现闪烁,在滑动listView中我们我们都会复用listView的缓存展示下一
解决fragment与viewpager一起使用时fragment中的listview数据出现重复
fragment同viewpager一起使用: viewpager.setOffscreenPageLimit(设置缓存页面的个数);/