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


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


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值