延迟加载不适用于使用Volley的RecyclerView

时间:2015-07-31 11:11:51

标签: android lazy-loading android-volley android-recyclerview

能够解析json(文本+图片)Feed并在RecyclerView内以网格方式显示它们。如问题中所述,我正在使用Volley库。 我有Volley SingletonLruBitmapCache,如this tutorial中所述。

除了延迟加载部分外,一切正常,即只有在加载所有文本和图像后才能看到视图。当然,理想的方法是首先加载文本而不等待图像下载,这是我现在无法实现的。

我的onBindViewHolder

RecyclerView Adapter

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
    final FeedItemBangCake item = feedItems.get(position);
    viewHolder.name.setText(item.getName());
    viewHolder.price.setText("Rs." + String.valueOf(item.getPrice()));
    viewHolder.prodId.setText(String.valueOf(item.getUniProdId()));
    if (imageLoader == null)
        imageLoader = AppController.getInstance().getImageLoader();


    // Feed image
    if (item.getImge() != null) {


        imageLoader.get(item.getImge(), new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
                viewHolder.feedImageView.setImageUrl(imageContainer.getRequestUrl(), imageLoader);
                viewHolder.feedImageView.setVisibility(View.VISIBLE);

            }

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });


    } else {
        viewHolder.feedImageView.setVisibility(View.GONE);
    }
}

getJsonData() - 负责制作截击请求的片段内的方法

 private void getJsonData(String URL_FEED_DATA) {

    // first check for cached request
    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Cache.Entry entry = cache.get(URL_FEED_DATA);
    if (entry != null) {
        // fetch the data from cache
        try {
            String data = new String(entry.data, "UTF-8");
            try {
                parseJsonFeed(new JSONObject(data));                    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    } else {
        // making fresh volley request and getting json
        JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET,
                URL_FEED_DATA, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                VolleyLog.d(TAG, "Response: " + response.toString());
                if (response != null) {
                    parseJsonFeed(response);                        
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());

                    } catch (Exception e) {

                    }
                }
            }
        });
        // Adding request to volley request queue
        AppController.getInstance().addToRequestQueue(jsonReq);

    }

parseJsonFeed()显然是解析json数据的方法。

我到现在为止尝试了什么:

我试图通过将适配器的图像加载部分包裹在run()内但在没有用的情况下将图像加载到单独的线程中。

        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {

            }
        });

在文本加载另一个请求时,对图像进行单独的截击请求是否是一个好主意?

注意:我提到的教程也处理延迟加载。我按照教程的确切程序,在我的情况下仍然懒得加载不工作。

0 个答案:

没有答案