【Android】AndroidStudio巧用Volley让ListView异步加载图片

来源:互联网 发布:什么软件收二手手机 编辑:程序博客网 时间:2024/06/18 06:22


如何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






1 0
原创粉丝点击