首页 > 解决方案 > RecyclerView 分页

问题描述

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

Json [ { "url": "http://.com/Wallpapers/Animals/790669.jpg", "time": "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);


}

标签: javaandroidjsonandroid-studiopagination

解决方案


您有 2 个请求:

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

所以你可以在不分页的情况下解决一个问题:

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

如何:

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

推荐阅读