如何listview里每一行都有图片的话,用异步加载的方式肯定是不错的,google给我们提供一个开源的组件是Volley,在github可以搜索得到,也可以直接在csdn上下载。
1.下载Volley.jar
点击从【CSDN下载】或去github下载。
这里有一点需要注意:csdn上不同网友上传的jar包不一定适合你的项目,当不适合的适合会报类似以下错误:
Error:Error converting bytecode to dex:
Cause: com.android.dx.cf.iface.ParseException: class name (com/android/volley/CacheDispatcherTest) does not match path (tests/bin/classes/com/android/volley/CacheDispatcherTest.class)
解决方法就是多下载几个jar包,看哪一个能用在你项目上即可。2.在AndroidStudio中添加这个jar包
都是老司机我就不细说了。
3.添加一个类,名字比如为:ApplicationController,代码如下:
package com.CommonHelper;
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
/**
* Created by jim on 16-12-29.
*/
public class ApplicationController extends Application {
private static final String TAG= ApplicationController.class.getSimpleName();
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private static ApplicationController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance=this;
}
public static synchronized ApplicationController getInstance(){
return mInstance;
}
public RequestQueue getRequestQueue(){
if(requestQueue==null)
requestQueue= Volley.newRequestQueue(getApplicationContext());
return requestQueue;
}
public ImageLoader getImageLoader(){
getRequestQueue();
if(imageLoader==null){
imageLoader=new ImageLoader(requestQueue,new LruBitmapCache());
}
return imageLoader;
}
public <T> void addToRequestQueue(Request<T> req, String tag){
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req){
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequest(Object tag){
if(requestQueue!=null){
requestQueue.cancelAll(tag);
}
}
}
4.配置manifest文件
把application节点下的name改为刚才新建的ApplicationController,如下图,蓝色框。
5.添加LruBitmapCache类,如下:
package com.CommonHelper;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
/**
* Created by jim on 16-12-29.
*/
public class LruBitmapCache extends LruCache<String,Bitmap> implements ImageLoader.ImageCache {
public static int getDefaultLruCacheSize(){
final int maxMemory= (int) (Runtime.getRuntime().maxMemory()/1024);
final int cacheSize=maxMemory/8;
return cacheSize;
}
public LruBitmapCache(){
this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
6.这两个类配置好之后,接下来怎么用,就太简单了。
首先,把你ListView中Item的ImageView控件换成Volley特有的NetworkImageView控件。
然后,调用NetworkImageView控件的setImageUrl(param1,param2)方法,起中param1就是图片的url,url就是类似http://www.baidu.com/112/123.jpg的这种形式别传错了。param2是一个ImageLoader对象,可以通过以下代码获取:
imageLoader = ApplicationController.getInstance().getImageLoader();
由于我ListView的Adapter是我自己定义的,我把我的贴上来,供大家参考(其实Volley的使用跟我的Adapter没多大关系):
package com.example.tianhuangping.YuanChengGongJuFang.Adapters;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.CommonHelper.ApplicationController;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.example.tianhuangping.Model.Tool;
import com.example.tianhuangping.YuanChengGongJuFang.Activities.YC_Search_yuancheng_Activity;
import com.example.tianhuangping.smarttoolsapp.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jim on 16-12-27.
*/
public class ToolListAdapter extends ArrayAdapter<Tool> {
Context mContext;
int resourceID;
ArrayList<Tool> listTool=new ArrayList<>();
private ImageLoader imageLoader;
public ToolListAdapter(Context context, int resource, ArrayList<Tool> objects) {
super(context, resource, objects);
this.listTool = objects;
this.resourceID = resource;
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
final Tool tool=listTool.get(position);
final ViewHolder viewHolder;
if (imageLoader == null)
imageLoader = ApplicationController.getInstance().getImageLoader();
if (convertView==null) {
view = LayoutInflater.from(mContext).inflate(resourceID, null);
viewHolder=new ViewHolder();
viewHolder.iv_toolpic=(NetworkImageView)view.findViewById(R.id.iv_toolpic);
viewHolder.tv_barcode=(TextView)view.findViewById(R.id.tv_barcode);
viewHolder.tv_statue=(TextView)view.findViewById(R.id.tv_statue);
viewHolder.tv_toolname=(TextView)view.findViewById(R.id.tv_toolname);
viewHolder.tv_toolsize=(TextView)view.findViewById(R.id.tv_toolsize);
viewHolder.tv_warehouse=(TextView)view.findViewById(R.id.tv_warehosue);
view.setTag(viewHolder);
}
else{
view=convertView;
viewHolder=(ViewHolder)view.getTag();
}
viewHolder.iv_toolpic.setImageUrl("http://www.baidu.com/UploadFiles/" + tool.getToolpic(), imageLoader);
viewHolder.tv_barcode.setText(tool.getBarcode());
viewHolder.tv_statue.setText(tool.getStutue());
viewHolder.tv_toolname.setText(tool.getToolname());
viewHolder.tv_warehouse.setText(tool.getWarehouse());
viewHolder.tv_toolsize.setText(tool.getToolsize());
if(position%2==1)
{
view.setBackgroundColor(Color.rgb(248,248,255));
}
else{
view.setBackgroundColor(Color.rgb(255,255,255));
}
return view;
}
private class ViewHolder
{
NetworkImageView iv_toolpic;
TextView tv_barcode;
TextView tv_toolname;
TextView tv_toolsize;
TextView tv_warehouse;
TextView tv_statue;
}
}
Tool类是我自己定义的一个类,用户将接收的服务器json字符串会被映射成这个类,调用起来比较方便。
7.结束
一切都搞定了,就是这么简单。当你的ListView里有数据被添加时,它就会自动帮你加载图片了。
关于Volly更多详细内容,请参考:
http://blog.csdn.net/qwm8777411/article/details/45833903