MainActivity如下:
package com.example.testlistview;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
//解决的问题:
//1 ListView异步加载网络图片
//2 ListView滑动时,图片错位
public class MainActivity extends Activity {
private ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void initView(){
listView=(ListView) findViewById(R.id.listView);
ArrayList<ListViewItem> arrayList=new ArrayList<ListViewItem>();
ListViewItem item1=new ListViewItem("xxxx", "http://images.csdn.net/20121018/zazhi-68-78-1018.jpg");
arrayList.add(item1);
ListViewItem item2=new ListViewItem("xxxx", "http://info-database.csdn.net/Upload/2012-10-08/zazhi-210-90-1008.jpg");
arrayList.add(item2);
ListViewItem item3=new ListViewItem("xxxx", "http://images.csdn.net/20121119/20111211223655841.jpg");
arrayList.add(item3);
ListViewItem item4=new ListViewItem("xxxx", "http://images.csdn.net/20121119/20120619174604972.jpg");
arrayList.add(item4);
ListViewItem item5=new ListViewItem("xxxx", "http://csdnimg.cn/www/images/pic_foot_report110.png");
arrayList.add(item5);
ListViewItem item6=new ListViewItem("xxxx", "http://csdnimg.cn/www/images/pic_foot_report.png");
arrayList.add(item6);
ListViewItem item7=new ListViewItem("xxxx", "http://csdnimg.cn/www/images/pic_foot_BNIA.png");
arrayList.add(item7);
ListViewItem item8=new ListViewItem("xxxx", "http://csdnimg.cn/www/images/pic_foot_gongshang.png");
arrayList.add(item8);
ListViewItem item9=new ListViewItem("xxxx", "http://images.csdn.net/20120803/logo-qixing02.jpg");
arrayList.add(item9);
ListViewItem item10=new ListViewItem("xxxx", "http://images.csdn.net/20120726/quanjing-logo-shouye.jpg");
arrayList.add(item10);
ListViewItem item11=new ListViewItem("xxxx", "http://images.csdn.net/20120726/nhn-logo-shouye.jpg");
arrayList.add(item11);
ListViewItem item12=new ListViewItem("xxxx", "http://images.csdn.net/20120510/shanghai-jiaoda-logo.jpg");
arrayList.add(item12);
ListViewItem item13=new ListViewItem("xxxx", "http://images.csdn.net/20120312/bigman2.gif");
arrayList.add(item13);
ListViewItem item14=new ListViewItem("xxxx", "http://images.csdn.net/20120216/csdn2.gif");
arrayList.add(item14);
ListViewItem item15=new ListViewItem("xxxx", "http://images.csdn.net/20121109/win8_100x74.jpg");
arrayList.add(item15);
ListViewItem item16=new ListViewItem("xxxx", "http://images.csdn.net/20120816/cf-20120816.jpg");
arrayList.add(item16);
ListViewItem item17=new ListViewItem("xxxx", "http://images.csdn.net/20120704/bi05.jpg");
arrayList.add(item17);
ListViewItem item18=new ListViewItem("xxxx", "http://images.csdn.net/20120816/amd-20120816.jpg");
arrayList.add(item18);
MyListViewAdapter adapter=new MyListViewAdapter(arrayList, MainActivity.this,listView);
listView.setAdapter(adapter);
}
}
ListViewItem的Bean如下:
package com.example.testlistview;
public class ListViewItem {
String content;
String imageURL;
public ListViewItem(String content, String imageURL) {
super();
this.content = content;
this.imageURL = imageURL;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getImageURL() {
return imageURL;
}
public void setImageURL(String imageURL) {
this.imageURL = imageURL;
}
}
自定义BaseAdapter如下:
package com.example.testlistview;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.loadimages.AsycPicLoader;
import com.example.loadimages.AsycPicLoader.ImageCallback;
public class MyListViewAdapter extends BaseAdapter{
private ArrayList<ListViewItem> mArrayList;
private Context mContext;
private AsycPicLoader asycPicLoader;
private ListView listView;
private HashMap<Integer, View> hashMap;
public MyListViewAdapter(ArrayList<ListViewItem> mArrayList,Context mContext,ListView listView ) {
super();
this.mArrayList = mArrayList;
this.mContext = mContext;
this.listView=listView;
asycPicLoader=new AsycPicLoader();
hashMap=new HashMap<Integer, View>();
}
public int getCount() {
if (mArrayList==null) {
return 0;
} else {
return mArrayList.size();
}
}
public Object getItem(int position) {
if (mArrayList==null) {
return null;
} else {
return mArrayList.get(position);
}
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
//从HashMap中取出此position对应的convertView
convertView=hashMap.get(position);
ViewHolder holder=null;
if (convertView==null) {
holder=new ViewHolder();
convertView=LayoutInflater.from(this.mContext).inflate(R.layout.listviewitem, null, false);
holder.textView=(TextView) convertView.findViewById(R.id.textView);
holder.imageView=(ImageView) convertView.findViewById(R.id.imageview);
convertView.setTag(holder);
} else {
holder=(ViewHolder) convertView.getTag();
}
//设置ListView的每个item
if (this.mArrayList!=null) {
ListViewItem listViewItem=this.mArrayList.get(position);
if (holder.textView!=null) {
holder.textView.setText(listViewItem.getContent());
}
if (holder.imageView!=null) {
try {
this.loadImage(listViewItem.getImageURL(),holder.imageView);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//设置完成后的convertView放在HashMap中
if (!hashMap.containsKey(position)) {
hashMap.put(position, convertView);
}
return convertView;
}
public void loadImage(String imgageURL, final ImageView imageView) {
asycPicLoader.loadImages(imgageURL, new ImageCallback() {
public void showLoadedImage(Drawable imageDrawable) {
if (imageDrawable!=null&&imageDrawable.getIntrinsicWidth()>0) {
imageView.setImageDrawable(imageDrawable);
}
}
});
}
private class ViewHolder{
ImageView imageView;
TextView textView;
}
}
异步加载网络图片,方法如下:
package com.example.loadimages;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class AsycPicLoader {
private Map<String, SoftReference<Drawable>> softReferenceMap;
//构造方法
public AsycPicLoader(){
softReferenceMap=new HashMap<String, SoftReference<Drawable>>();
}
//加载图片
public Drawable loadImages(final String imageURL,final ImageCallback imageCallback){
//如果图片在SoftReference中,则将其取出
if (softReferenceMap.containsKey(imageURL)) {
SoftReference<Drawable> softReference=softReferenceMap.get(imageURL);
if (softReference!=null) {
Log.i("xx", "从缓存中取出来");
return softReference.get();
}
}
//如果图片不在SoftReference中,则从网络获取图片.
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Drawable drawable=(Drawable) msg.obj;
imageCallback.showLoadedImage(drawable);
}
};
new Thread(){
public void run() {
super.run();
Drawable drawable=LoadImageFromUrl(imageURL);
softReferenceMap.put(imageURL, new SoftReference<Drawable>(drawable));
Message message=new Message();
message.obj=drawable;
handler.sendMessage(message);
};
}.start();
return null;
}
//从网络获取图片
private Drawable LoadImageFromUrl(String url){
try {
return Drawable.createFromStream((new URL(url)).openStream(), "src");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//定义一个回调接口.用于图片下载完成后,在ImageView中显示图片
public interface ImageCallback {
public void showLoadedImage(Drawable imageDrawable);
}
}
main.xml如下:
<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/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
</ListView>
</RelativeLayout>
listviewitem.xml如下:
<?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="50dip"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageview"
android:layout_width="50dip"
android:layout_height="50dip"
/>
<TextView
android:id="@+id/textView"
android:layout_width="50dip"
android:layout_height="50dip"
android:text="haha"
android:layout_marginLeft="150dip"
/>
</LinearLayout>