Adapter:   ----

//adapter的构造方法:   参数1 为url数组:

public static String[] mList;// 讲url保村在静态的String[] 中 在其他类可以直接调用

public MyListAdapter(String[] list, Context context, ListView listView) {
this.mList = list;
this.mContext = context;
bitmapUtils = new HttpUtils(context, listView);
listView.setOnScrollListener(this);
}

在getView()方法中为url设置tag    但获取发的url是一样的 这样就导只tag长向是和其他一样

holder.mImageView.setTag(mList[position]);

bitmapUtils.display(item, mImageView);//加载图片  不过不加载网络图片 只加载内存和本地图片   没有不加载

//为Adapter添加 listView的滑动监听

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
// 加载可见项
bitmapUtils.loadImage(mStart, mEnd);
} else {
bitmapUtils.stopLoad();
}

}

private boolean isFrist = true;

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
mStart = firstVisibleItem;
mEnd = firstVisibleItem + visibleItemCount;
if (isFrist && visibleItemCount > 0) {
bitmapUtils.loadImage(mStart, mEnd);
isFrist = false;
}

}

图片加载类 :主要用到LruCache 类和异步加载:  然后关于图片的错乱处理:(还可以加上本地缓存来进一步优化)

ImageView image =(ImageView)listiew.findViewWithTag(url); 来找到控件:

//-------------------------犹豫的分割线----------------======================

package com.example.listoptimization.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;

import com.example.listoptimization.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.widget.ImageView;
import android.widget.ListView;

/**
* 还差本地缓存 实现了网络和内存加载
*
* @author chen
*
*/
public class HttpUtils {
private ImageView mImageView;
private String murl;

private Context mContext;
private LruCache<String, Bitmap> mCache;

public HttpUtils(Context context, ListView list) {
this.mContext = context;
this.mListView = list;
int maxSize = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxSize / 5;
mCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
mSet = new HashSet<HttpUtils.MyAsyncTask>();
}

public void display(String url, ImageView image) {
this.mImageView = image;
this.murl = url;
Bitmap bitmapFromCache = getBitmapFromCache(url);
if (bitmapFromCache != null) {
System.out.println("内存中加载");
image.setImageBitmap(bitmapFromCache);

} else {
image.setImageResource(R.drawable.ic_launcher);

}

}

// 加载万络图片
public void loadImage(String url, ImageView imageView) {
Bitmap bitmapFromCache = getBitmapFromCache(url);
if (bitmapFromCache == null) {
new MyAsyncTask(url).execute(url);

} else {

imageView.setImageBitmap(bitmapFromCache);

}
}

// 从LruCachhe中获取
public Bitmap getBitmapFromCache(String path) {
if (path != null) {
Bitmap mBitmap = mCache.get(path);
return mBitmap;
}
return null;

}

// 保村图片到缓存中去
public void saveBitmapToCache(String path, Bitmap bitmap) {
if (path != null) {

if (getBitmapFromCache(path) == null) {
mCache.put(path, bitmap);

}
}

}

// 根据url获取Bitmap
public Bitmap getBitmapFromService(String url) {
Bitmap bitmap = null;
try {
URL murl = new URL(url);
HttpURLConnection mHttpConnection = (HttpURLConnection) murl.openConnection();
mHttpConnection.setRequestMethod("GET");
mHttpConnection.setConnectTimeout(3000);
if (mHttpConnection.getResponseCode() == 200) {
InputStream mInputStream = mHttpConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(mInputStream);

}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}

public class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
String url;

public MyAsyncTask(String url) {

this.url = url;
}

@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmapFromService = getBitmapFromService(params[0]);
saveBitmapToCache(url, bitmapFromService);
return bitmapFromService;
}

@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
ImageView mImageView = (ImageView) mListView.findViewWithTag(url);
if (mImageView != null && result != null) {
mImageView.setImageBitmap(result);
}

mSet.remove(url);

}

}

private Set<MyAsyncTask> mSet;// 用于管理task任务
private ListView mListView;

public void loadImage(int start, int end) {
for (int i = start; i < end; i++) {
String url = MyListAdapter.mList[i];
Bitmap bitmapFromCache = getBitmapFromCache(url);
if (bitmapFromCache != null) {
ImageView mImageView = (ImageView) mListView.findViewWithTag(url);
mImageView.setImageBitmap(bitmapFromCache);

} else {
MyAsyncTask task = new MyAsyncTask(url);
task.execute(url);
mSet.add(task);

}

}

}

public void stopLoad() {
if (mSet != null) {

for (MyAsyncTask myAsyncTask : mSet) {
myAsyncTask.cancel(false);
}

}
}
}

listview加载图片显示的更多相关文章

  1. Unity3d:加载Format是RGB24位的图片失败(加载图片显示问号)

    问题描述:加载图片显示是个红色的问号,调试发现,Texture的Format=RGB24的都加载失败,ARGB32位的都能成功,按照常规,首先去度娘,看是否有人遇到和我同样的问题,结果一无所获.将用N ...

  2. android listview 加载图片错乱(错位)

       写道 今天晚上一个朋友介绍我看了一篇文章,也是解决android中listview在加载图片错位的问题,看了之后,感觉写的很好,自己也遇到这个问题,但是又不知道从何下手,看到这篇文章后,我的问题 ...

  3. React-Native ListView加载图片淡入淡出效果的组件

    今天练习项目中需要给listview在加载图片时增加一个淡入淡出的效果,因此干脆就自己封装了一个组件: 'use strict' import React from 'react-native' va ...

  4. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...

  5. Android webView加载图片显示过大的问题

    webview的基本使用流程这里我就不重复说明了,本篇针对的是文章详情加载完成后出现的情况,这里我们使用的方法是:通过js脚本,重置img标签中图片的宽度和高度. 使用步骤: 1.此方法需要使用js, ...

  6. BackgroundWorker实现的winfrom中实现异步等待加载图片显示

    BackgroundWorker简介    BackgroundWorker在winfrom中有对应控件,该有三个事件:DoWork .ProgressChanged 和 RunWorkerCompl ...

  7. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  8. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  9. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

随机推荐

  1. win7的IE11降到IE8

    我为什么要降低IE版本呢?...... 下载了抓包工具HttpWatch,下载地址http://pan.baidu.com/s/1kVhPMmj  版本如下: 用IE11打开抓包时流内没有内容,可能跟 ...

  2. php验证复选框有效性的示例

    本文介绍一个简单的php通过代码验证复选框值的有效性,有需要的可以参考一下 验证复选框的php代码,如下: 复制代码代码如下: <?php   /**   * 在php中验证复选框的有效性  * ...

  3. 简简单单制作鼠标静态动态 ani cur 小结 鼠标形状指针

    近日在网上看到一个视频录制软件里的鼠标样子的指针感觉蛮好的自己制作了一个,效果还不错,几乎跟那个鼠标形状一模一样啦.总结了下制作过程现分享如下:1.首先用ps建立一个30*30像素的空白图片 然后将自 ...

  4. tpl demo

    using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Ta ...

  5. 数据库 - FMDB

    FMDB 是基于 SQLite 封装的 面向对对象(OC) 的API. FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API FMDB 需要libsqli ...

  6. JavaScript高级之闭包的概念及其应用

    主要内容: 什么是闭包 闭包使用的一般模式 闭包都能做些什么 本文是我的JavaScript高级这个系列中的第二篇文章. 在这个系列中,我计划分析说明 一下JavaScript中的一些常用的而又神秘的 ...

  7. Latex 常用知识点存档

    前言: 本篇仅作为自己的知识存档. $Latex$是什么,就不用介绍了,网上好多教程和知识点,当忘记的时候搜一下就可以了. 本科做美赛和毕设的时候用的$Latex$排版,最近开始在博客园写点东东,发现 ...

  8. REST内容协商注解

    @Produces注解: 用于定义方法的响应实体的数据类型.可以定义一个或多个,同时可以为每种类型定义质量因素,质量因素取值范围从0--1的小数值,默认为1. 示例: @Path("conn ...

  9. [原博客] POI系列(4)

    正规.严谨.精妙. -POI BZOJ 1531 : [POI2005]Bank notes 裸的背包,可以二进制拆分一下.一个物品比如说有n个,可以拆成 1,2,4,8,16...个. OJ上没有样 ...

  10. weixin

    http://gps.yesky.com/19/34467019.shtml http://***/goods.php?id=320 http://www.sablog.net/blog/archiv ...