【发布时间】:2021-07-12 18:06:36
【问题描述】:
说明
假设我有一个RecyclerView,它显示了内部存储中额外文件夹中的 50 张照片。考虑到这一点,那 50 张照片不会随时更改。因此,当用户启动应用程序时,它会从互联网上获取 50 张照片并保存在内部存储中。如果用户启动照片活动,则将运行从 extras 文件夹中获取这 50 张照片的循环。此循环将从内部存储中获取所有照片,并将它们的BUCKET_DISPLAY_NAME 与extras 进行比较。如果两者相等,则只有它会显示在recyclerView
考虑到这种情况,我想将recyclerView state 或data 保存在内部存储中。因此,当用户下次打开应用程序时,它不会获取所有照片,而是会直接加载带有已保存照片的 recyclerview。
获取方法
public ArrayList<ImageModel> fetchImages() {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
projection = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
cursor = activity.getApplicationContext().getContentResolver().query(uri, projection, null, null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
arrayList.clear();
while (cursor.moveToNext()) {
long mediaId = cursor.getLong(column_index_data);
name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
if (name.equals("extras")) {
Uri uriMedia = Uri.withAppendedPath(uri, "" + mediaId);
ImageModel imageModel = new ImageModel();
imageModel.setUri(uriMedia.toString());
arrayList.add(imageModel);
}
}
cursor.close();
return arrayList;
}
如果用户有很多照片而不是所需的 50 张照片,则在执行此方法时可能需要很长时间。
那么,
arrayList = fetchImages();
adapter = new PhotosAdapter(requireActivity().getApplicationContext(), arrayList, getActivity(), this, this);
recyclerView.setAdapter(adapter);
使用此方法将图像加载到recyclerView。
那么,有没有办法保存加载的RecyclerView 或RecyclerView Data?
怀疑
据https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.State
State 对象还可以保存任意数据,由资源 ID 标识。
我对任意数据不太了解,但是,如果它表示recyclerView's 数据,那么我该如何使用RecyclerView.State 对象来恢复recyclerView 中的数据?
注意
假设我可以在内部存储中保存任何类型的对象并将该对象加载到另一个相同类的对象中。
编辑
如答案中所述,无法存储已加载的 recyclerView。相反,需要缓存数据。由于缓存内存也在内部存储中,它迫使我的应用程序跳过帧,因为我正在我的应用程序的onCreateView() 中加载图像。我可以创建一个新线程,它将在后台处理它并且没有跳帧。但是,它会产生我不想要的眨眼效果。
【问题讨论】:
-
我猜你需要使用一些缓存技术。我建议你实现一些已经被证明的东西,比如 LRUCache。 developer.android.com/reference/android/util/LruCache
标签: java android android-recyclerview