java - 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);
}
解决方案
您有 2 个请求:
- 获取所有壁纸的列表
- 读取图像
所以你可以在不分页的情况下解决一个问题:
- 当用户滚动到某个项目时,首先加载新图像。
onBindViewHolder
如果图像尚未下载,请在 中提出请求。- 将已请求的图像存储在应用程序内部存储中。因此,通过向上滚动,您将无需再次加载数据。
如何:
- 在 Activity/Fragment 中制作请求图像的方法
- 对请求进行计数(如果用户滚动查看 3 个项目 - count = 3)。首先,全部完成后,制作
adapter.notifyDataSetChanged()
- 对请求进行计数(如果用户滚动查看 3 个项目 - count = 3)。首先,全部完成后,制作
- 提供 Activity/Fragment-instance 作为 Adapter.Holder 的接口
- 为每个项目设置一些
minHeight
以同时仅加载少量项目。 - 检查带有图像的
onBindViewHolder
文件是否已经存在。- 如果 url = "..Wallpapers/Animals/790669.jpg",那么创建同名文件,首先还要在本地存储中创建一个文件夹。
- 如果文件存在 - 只需读取并显示图像
- 如果不存在 - 提出请求
推荐阅读
- ios - drawRect 无效上下文
- google-cloud-platform - 从 Bigquery 中的原始 Google 分析会话数据替换流量源?
- javascript - 如何检测云火库功能 onUpdate() 中添加的新字段
- python - 如何比较两个str值数据框python pandas
- python-3.x - 为什么以小数倒数会导致 xxx.9999999999999999999x?
- java - Transformer Kafka 中的 ManagedChannel 线程安全吗
- performance - RandomUtils.nextLong(10L,1000L) 失败,JMeter HTTP 请求正文中出现“意外令牌:10L”
- mouse - Is there a way to duplicate my mouse input position to another PC through local network?
- configuration - How do I tell figwheel to start and connect to Google Chrome instead of Firefox?
- python-3.x - 如何用字符串联系表情符号