【问题标题】:how to add volley image request in an arraylist?如何在数组列表中添加凌空图像请求?
【发布时间】:2015-08-19 16:13:49
【问题描述】:

我有下面的代码 2 东西,Volley 请求设置图像,array list adapter 显示静态图像。

我需要帮助在数组列表中添加凌空请求,我想要在数组列表中显示凌空图像

请问你能帮我怎么做吗?

(请注意,我已经有一个 phpscript 可以在 json 中向我发送图像的路径 url)

代码:main_activity

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  RequestQueue mRequestQueue;

  final String IMAGE_URL =
            "http://developer.android.com/images/training/system-ui.png";
  mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);

//Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

//Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());

//Instantiate the RequestQueue with the cache and network.
mRequestQueue = new RequestQueue(cache, network);

//Start the queue
mRequestQueue.start();


ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
            LruBitmapCache.getCacheSize(mContext)));
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);


CustomListAdapter adapter=new CustomListAdapter(this, itemname, imgid);
list=(ListView)findViewById(R.id.list);
list.setAdapter(adapter);

list.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
        // TODO Auto-generated method stub
        String Slecteditem= itemname[+position];
        Toast.makeText(getApplicationContext(), Slecteditem, Toast.LENGTH_SHORT).show();

    }
});

}

数组列表适配器

包 com.example.p;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomListAdapter extends ArrayAdapter<String> {

    private final Activity context;
    private final String[] itemname;
    private final Integer[] imgid;

    public CustomListAdapter(Activity context, String[] itemname, Integer[] imgid) {
        super(context, R.layout.mylist, itemname);
        // TODO Auto-generated constructor stub

        this.context=context;
        this.itemname=itemname;
        this.imgid=imgid;
    }

    public View getView(int position,View view,ViewGroup parent) {
        LayoutInflater inflater=context.getLayoutInflater();
        View rowView=inflater.inflate(R.layout.mylist, null,true);

        TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        TextView extratxt = (TextView) rowView.findViewById(R.id.textView1);

        txtTitle.setText(itemname[position]);
        imageView.setImageResource(imgid[position]);
        extratxt.setText("Description "+itemname[position]);
        return rowView;

    };
}

和Lrubitmapcache

package com.example.p;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruBitmapCache extends LruCache<String, Bitmap>
        implements ImageCache {

    public LruBitmapCache(int maxSize) {
        super(maxSize);
    }

    public LruBitmapCache(Context ctx) {
        this(getCacheSize(ctx));
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }

    // Returns a cache size equal to approximately three screens worth of images.
    public static int getCacheSize(Context ctx) {
        final DisplayMetrics displayMetrics = ctx.getResources().
                getDisplayMetrics();
        final int screenWidth = displayMetrics.widthPixels;
        final int screenHeight = displayMetrics.heightPixels;
        // 4 bytes per pixel
        final int screenBytes = screenWidth * screenHeight * 4;

        return screenBytes * 3;
    }
}

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    我认为出于您的目的,您应该使用 Picasso 或 Glide,而不是 Volley。

    Volley 是一个了不起的东西,但是对于带有图像加载的列表,最好使用更具体的图像加载库。

    以下是 Glide 和 Picasso 工具的链接:

    【讨论】:

    • 我已经学会了如何使用 volley 是否值得用毕加索重新开始?我已经花时间在凌空上,
    • 我认为你应该调查一下 Glide 和 Picasso。您将花费最多半小时来处理每个库,但将来您将能够减少开发时间来处理图像加载。
    • @AlexSarapin 是正确的,在其他用法中,我使用 volley 进行了几个自定义的多部分请求,将照片上传到我的服务器,这很棒,但是对于图像加载我使用 Picasso,它非常健壮、模块化,正如 Alex 所说,可能会花费你半个小时(包括设置),它还会缩短你对图片呈现方式的一些修改(例如圆角、图像拉伸、等)
    • @TommySM 感谢您的评论,好的,那就从毕加索开始吧。
    • @AlexSarapin 经过一番调查,你是对的,我将从毕加索开始(我想现在最好从毕加索开始吧?)
    【解决方案2】:

    在其他帖子中,您向我寻求帮助。 我的图像来自一个休息服务器,作为 Json 字符串 Base64 编码。然后我做下一个:

      public View getView(int position, View convertView, ViewGroup parent) {
            final ObjectLogados o = items.get(position);
            final ViewHolder holder;
            View vi = convertView;
            if (vi == null){
                LayoutInflater inflater = context.getLayoutInflater();
                vi = inflater.inflate(R.layout.singlerowlog, null);// e' preciso fazer o inflate pois a view nao ainda nao esta em activity alguma
                holder = new ViewHolder();
                holder.ivImgMedLog= (ImageView) vi.findViewById(R.id.ivp_imagemedlog) ;
                holder.tv_usuario = (TextView) vi.findViewById(R.id.tv_hnomemedlogado);
                vi.setTag(holder);
    
            }
            else {
                holder = (ViewHolder) convertView.getTag();
            }
    
            holder.tv_usuario.setText(o.getUsuario());
            String imageKey="MED"+String.valueOf(o.getNr_usuario());
            final Bitmap bitmap = Common.getInstance().getBitmapFromMemCache(imageKey);
            if (bitmap != null) {
                holder.ivImgMedLog.setImageBitmap(bitmap);
            }else {
                holder.ivImgMedLog.setImageDrawable(context.getResources()
                        .getDrawable(R.drawable.empty));
                downloadimage(holder.ivImgMedLog,o.getNr_usuario());
            }
    
            return vi;
        }
    
        static class ViewHolder {
            TextView tv_usuario;
            ImageView ivImgMedLog;
    
        }
    
        private void downloadimage(final ImageView imageView,final int nr){
            //final ImageView imageView=imV;
            String url=Common.getServerURL() + "\"RetrieveImageStaff\"";
            JSONArray ja = new JSONArray();
            ja.put(nr);
    
            JSONObject jsonBody = new JSONObject();
            try {
                jsonBody.put("_parameters", ja);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url,
                    jsonBody, new Response.Listener<JSONObject>() {
    
                @Override
                public void onResponse(JSONObject response) {
                    JSONObject anEntry = null, entries = null;
                    String ims = "";
                    try {   // TODO Auto-generated method stub
                        JSONArray LResult = response.getJSONArray("result");
                        String s = LResult.get(0).toString();
                        anEntry = new JSONObject(s);
                        ims = anEntry.getString("imagem");
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
    
                    Bitmap decodedByte = null;
                    try {
                        if (!TextUtils.isEmpty(ims)) {
                            byte[] decodedString = Base64.decode(ims, Base64.DEFAULT);
                            decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                            if (imageView != null) {
                                if (decodedByte != null) {
                                    imageView.setImageBitmap(decodedByte);
                                    Common.getInstance().addBitmapToMemoryCache("MED"+String.valueOf(nr), decodedByte);
                                } else {
                                    imageView.setImageDrawable(imageView.getContext().getResources()
                                            .getDrawable(R.drawable.empty));
                                }
                            }
                        } else {
                            imageView.setImageDrawable(imageView.getContext().getResources()
                                    .getDrawable(R.drawable.empty));
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
    
            }, new Response.ErrorListener() {
    
                @Override
                public void onErrorResponse(VolleyError error) {
                    // TODO Auto-generated method stub
                    //Log.v(TAG, error.getMessage());
                    Toast.makeText(context, "Erro adquirindo imagem...." + error.getMessage(), Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                }
            });
            jr.setRetryPolicy(new DefaultRetryPolicy(Common.DEFAULT_TIMEOUT_MS,
                    Common.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
            Common.getInstance().addToReqQueue(jr, "jreq"); //reqQueue.add(jr);
        }
    

    您可以将请求更改为使用 volley 并获取图像。因此,您可以将https://developer.android.com/training/volley/request.html#request-image 中描述的代码更改为类似于:

    ImageView mImageView;
    String url = "http://i.imgur.com/7spzG.png";
    mImageView = (ImageView) findViewById(R.id.myImage);
    ...
    
    // Retrieves an image specified by the URL, displays it in the UI.
    ImageRequest request = new ImageRequest(url,
        new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                mImageView.setImageBitmap(bitmap);
            }
        }, 0, 0, null,
        new Response.ErrorListener() {
            public void onErrorResponse(VolleyError error) {
                mImageView.setImageResource(R.drawable.image_load_error);
            }
        });
    // Access the RequestQueue through your singleton class.
    MySingleton.getInstance(this).addToRequestQueue(request);
    

    【讨论】:

    • 你甚至使用一些缓存吗?或者一些图像大小调整?这是一种非常糟糕的方法,可以直接通过 http 客户端加载图像,而无需任何压缩或调整大小。换句话说 - 这是通往 OutOfMemoryException 的直接途径。
    • 我的图片尺寸较小。但如果需要,您可以添加调整大小或压缩。做起来太容易了。是的,我使用 lrucache。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多