【问题标题】:RecylerView PaginationRecyclerView 分页
【发布时间】:2021-07-18 05:51:25
【问题描述】:

我有一个壁纸应用程序,我从 api 获取图像数据,问题是我从 api 获取所有图像,这就是为什么加载需要太多,所以我想添加分页以获得更好的优化,但事情是我不想要使用 mysql 因为我有很多图像。没有mysql如何添加分页?

json [ { "url": "http://.com/Wallpapers/Animals/790669.jpg", “时间”:“2021-04-21 08:41:17” }, { "url": "http://.com/Wallpapers/Animals/790810.jpg", “时间”:“2021-04-21 08:41:17” } ]

我的代码

private void getData() {
    RequestQueue queue = Volley.newRequestQueue(this);
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, dataurl+name, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray array = response.getJSONArray("files");
                for (int i = 0; i < array.length(); i++) {
                    JSONObject imgObject = array.getJSONObject(i);
                    WPList imgList = new WPList();
                    imgList.setURL(imgObject.getString("url").toString());
                    imgList.setDate(imgObject.getString("time").toString());
                    anlist.add(imgList);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            recyclerView.setLayoutManager(new GridLayoutManager(MainActivity2.this, 3));
            recyclerView.setHasFixedSize(true);
            adapter = new WallpaperAdapter(MainActivity2.this, anlist);
            progressBar.setVisibility(View.GONE);
            recyclerView.setAdapter(adapter);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            Toast.makeText(MainActivity2.this, "No Available Image Found", Toast.LENGTH_SHORT).show();
            Log.d("tag", "onErrorResponse: " + error.getMessage());
        }
    });
    // Add JsonObjectRequest to the RequestQueue
    jsonObjectRequest.setShouldCache(false);
    jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    queue.getCache().clear();
    queue.add(jsonObjectRequest);


}

【问题讨论】:

  • 什么时候请求图片?在 onBindViewHolder 的 Adapter 中?
  • @anatoli 是 onBindViewHolder。

标签: java android json android-studio pagination


【解决方案1】:

您有 2 个请求:

  • 获取所有壁纸列表
  • 读取图像

所以不用分页也可以解决问题:

  • 当用户滚动到某个项目时,首先加载新图像。
    • 如果图像尚未下载,请在 onBindViewHolder 中提出请求。
    • 在应用程序内部存储中存储已请求的图像。因此,通过向上滚动,您无需再次加载数据。

如何:

  • 在Activity/Fragment中制作请求图片的方法
    • 对请求进行计数(如果用户滚动查看 3 个项目 - count = 3)。首先,完成后,制作adapter.notifyDataSetChanged()
  • 提供 Activity/Fragment-instance 作为 Adapter.Holder 的接口
  • 为每个项目设置一些 minHeight 以同时仅加载少量项目。
  • onBindViewHolder 中检查带有图像的文件是否已经存在。
    • 如果 url = "..Wallpapers/Animals/790669.jpg",那么创建同名文件,首先还要在本地存储中创建一个文件夹。
    • 如果文件存在 - 只需读取并显示图像
    • 如果不存在 - 提出请求

【讨论】:

  • 我已经在用 glide 缓存图片了。问题是第一次加载时,加载时间太长,因为加载该类别的每张图片太慢了,而且我已经先加载了新图片。
  • Glide.with(context).load(anlist.get(position).getURL()).thumbnail(0.30f).apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL).override (200, 200)).into(holder.imageView);
  • onBindViewHolder 仅在可见的项目上调用。如果您已经在onBindViewHolder 中提出请求,首先您在onCreate 中说过,那么分页无法解决长时间加载的问题。这听起来像是网速低或其他问题。下载文件时显示加载视图。
  • 如果您在开始时提出 200 个请求,我已经描述了如何将其减少到少量。如果不是这样,请从头开始更好地描述您的问题。
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2017-10-22
  • 2022-01-15
  • 1970-01-01
  • 2016-03-29
  • 2020-06-12
  • 2021-07-24
  • 2016-11-22
相关资源
最近更新 更多