zoukankan      html  css  js  c++  java
  • [android]完美的解决方案ListView加载网络图片反弹问题


    为什么

    先说为什么有照片反弹。

    使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用。使ListView滑动更为流畅。

    但会带来一个问题,当最顶部的item滑出屏幕时。会变成下一个从底部将要滑进来的item。每次滑进来的item都要去请求网络获得图片。

    第一个item滑出去时,是带着图片的。

    其ImageView指向了一块内存。当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(仅仅有一半在屏幕里能看到了)的还是指向

    同一块内存。载入的了同一张图片。

    可是底部的item仅仅要一滑进来,就開始请求网络,要获取图片了。当底部item获取图片成功会将原有的图片覆盖。

    当每一个item都是这种运行逻辑。整个item就会变得非常乱,图片乱闪。


    怎样解决

    解决问题有两个思路:

    一个是为在item复用时,检查ImageView上是否为空,假设不为空(有图片)。则

    viewHolder.imageview.setVisiable(View.GONE);

    然后这个item会继续运行请求网络图片,当请求下来的图片不为空(请求成功,而且设置成功),此时在viewHolder.imageview.setVisiable(View.VISIABLE);


    以下是另外一种思路的具体过程。

    具体过程

    布局文件:仅仅有一个ListView

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ListView
            android:id="@+id/lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
    </RelativeLayout>

    ListView每一个item布局

    <?

    xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/item_iv" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_horizontal" android:src="@drawable/ic_launcher"/> </LinearLayout>


    重点来了。MyAdapter中getView()方法,有两个重点。

    public MyAdapter(Context context,List<Info> data){
    	this.context = context;
    	this.data = data;
    }
    
    @Override
    	public View getView(int position, View convertView, final ViewGroup parent) {
    		final ViewHolder holder;
    		if(convertView ==null){
    			...
    		}else{
    			...
    		}
    		//获得集合中实体类对象
    		final Info info = data.get(position);
    		//获得图片网址
    		final String img = info.getImgUrl();
    		
    		<span style="color:#ff0000;">//重点1,为每一个ImageView设置一个tag。值为图片网址(保证tag的唯一性)。

    </span> holder.iv.setTag(info.getImgUrl()); ... Bitmap bitmap =/*网络请求来的bitmap*/ <span style="color:#ff0000;">//重点2。获得tag的值。与该item中缩放图片的网址进行比較</span> String tag = (String) holder.iv.getTag(); <span style="color:#ff0000;">//假设这个imageview的值,和他应该放的图片的地址值一样,说明这个图片是属于这个ImageView的。能够载入。

    </span> if(tag!=null&&tag.equals(info.getImg())){ iv.setImageBitmap(bitmap); } return convertView; } class ViewHolder{ TextView tv; ImageView iv; }



    转载请注明出处:http://blog.csdn.net/bless2015/article/details/46445325



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Hpuoj1039--【C语言训练】角谷猜想
    hpuoj--1093: 回文数(一)
    Zoj1628--Diamond(Dfs《暴力》)
    Poj1995--Raising Modulo Numbers(快速幂)
    杭电5137--How Many Maos Does the Guanxi Worth(Spfa+暴力枚举)
    杭电1166--敌兵布阵(线段树 | 树状数组)

    南阳5--Binary String Matching(Kmp)
    CGAL
    vs c++默认路径
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4854921.html
Copyright © 2011-2022 走看看