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



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

  • 相关阅读:
    c:forTokens标签循环输出
    jsp转long类型为date,并且格式化
    spring中@Param和mybatis中@Param使用区别(暂时还没接触)
    734. Sentence Similarity 有字典数组的相似句子
    246. Strobogrammatic Number 上下对称的数字
    720. Longest Word in Dictionary 能连续拼接出来的最长单词
    599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
    594. Longest Harmonious Subsequence强制差距为1的最长连续
    645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
    409. Longest Palindrome 最长对称串
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4854921.html
Copyright © 2011-2022 走看看