Recyclerview 不使用 viewpager 刷新片段中的数据
Recyclerview not refreshing data in a fragment with viewpager
我正在使用 recyclerview 显示 sd 卡中的本地图像和视频,当我从我的片段中删除任何视频或图像时,它已被删除但仍保留在那里。我必须回去显示数据的变化。我的回收站视图不会自动刷新不会自动刷新。谁能告诉我如何解决
这是我的代码。
RecyleAdapter.java
public class SavedRecycleAdapter extends RecyclerView.Adapter<SavedRecycleAdapter.MyViewHolder> {
private static String DIRECTORY_SAVE_MEDIA = "/storage/emulated/0/Folder/";
private ArrayList <File> filesList;
private Activity activity;
Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView videosThumbnail, picturesThumbnail;
ImageButton imageDelete, imageShare, videoShare, videoDelete;
CardView videoCardView, imageCardView;
public MyViewHolder(View itemView) {
super(itemView);
picturesThumbnail = itemView.findViewById(R.id.imagesThumbnailSaved);
videosThumbnail = itemView.findViewById(R.id.videosThumbnailSaved);
imageDelete = itemView.findViewById(R.id.imageDeleteSaved);
imageShare = itemView.findViewById(R.id.imageShareSaved);
videoDelete = itemView.findViewById(R.id.videoDeleteSaved);
videoShare = itemView.findViewById(R.id.videoShareSaved);
videoCardView = itemView.findViewById(R.id.videoCardViewSaved);
imageCardView = itemView.findViewById(R.id.imageCardViewSaved);
}
}
public SavedRecycleAdapter(ArrayList <File> filesList, Activity activity) {
this.filesList = filesList;
this.activity = activity;
}
@Override
public SavedRecycleAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflatedView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.saved_item_view, parent, false);
return new SavedRecycleAdapter.MyViewHolder(inflatedView);
}
@Override
public void onBindViewHolder(final SavedRecycleAdapter.MyViewHolder holder, int position) {
final File currentFile = filesList.get(position);
if (currentFile.toString().endsWith(".mp4")) {
holder.videoCardView.setVisibility(View.VISIBLE);
holder.imageCardView.setVisibility(View.GONE);
Glide.with(activity)
.load(Uri.fromFile(new File(currentFile.getAbsolutePath())))
.into(holder.videosThumbnail);
holder.videoDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File(currentFile.getAbsolutePath());
boolean deleted = file.delete();
//
}
});
holder.videosThumbnail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, VideoViewerActivity.class);
intent.putExtra("video", currentFile.getAbsolutePath());
activity.startActivity(intent);
}
});
holder.videoShare.setOnClickListener(new View.OnClickListener() {
//Do stuff
} else {
holder.videoCardView.setVisibility(View.GONE);
holder.imageCardView.setVisibility(View.VISIBLE);
Glide.with(activity).load(currentFile.getAbsolutePath())
.skipMemoryCache(false)
.crossFade().into(holder.picturesThumbnail);
holder.imageDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File(currentFile.getAbsolutePath());
boolean deleted = file.delete();
holder.picturesThumbnail.setOnClickListener(new View.OnClickListener() {
// Do stuff
holder.imageShare.setOnClickListener(new View.OnClickListener() {
}
}
@Override
public int getItemCount() {
return filesList.size();
}
}
这是我的片段代码
public class SavedStoriesFragment extends Fragment {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
private static final String FILE_PATH = "/storage/emulated/0/Folder/";
public SavedStoriesFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_saved_stories, container, false);
recyclerView=(RecyclerView)v.findViewById(R.id.savedRecyclerView);
layoutManager = new GridLayoutManager(getContext(),2);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addItemDecoration(new ItemDecorationAlbumColumns(
getResources().getDimensionPixelSize(R.dimen.image_list_space),2));
getListFiles(new File(FILE_PATH));
SavedRecycleAdapter ra = new SavedRecycleAdapter(this.getListFiles(new File(FILE_PATH)), getActivity());
recyclerView.setAdapter(ra);
return v;
}
private ArrayList<File> getListFiles(File parentDir) {
ArrayList<File> inFiles = new ArrayList<File>();
File[] files;
files = parentDir.listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().endsWith(".jpg") ||
file.getName().endsWith(".png") ||
file.getName().endsWith(".jpeg")||
(file.getName().endsWith(".mp4") ||
file.getName().endsWith(".gif"))) {
if (!inFiles.contains(file))
inFiles.add(file);
}
}
}
return inFiles;
}
}
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> mFragment = new ArrayList<>();
ArrayList<String> mTitles = new ArrayList<>();
public void addFragments (Fragment fragment,String tabTitles)
{
this.mFragment.add(fragment);
this.mTitles.add(tabTitles);
}
public ViewPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragment.get(position);
}
@Override
public int getCount() {
return mFragment.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles.get(position);
}
}
您需要使用 notifyDataSetChanged()
或 notifyItemRemoved(position)
来通知您的适配器基础数据已更改或特定项目已删除。您可以从 here.
中阅读有关方法的更多信息
删除某些东西后调用片段方法获取新的 ListFiles 和 notifyDataSetChanged()
例如
片段内部
public void refreshRecyclerView() {
ra.setFilesList(this.getListFiles(new File(FILE_PATH)))
}
内部适配器
public void setFilesList(ArrayList <File> filesList) {
this.filesList = filesList;
notifyDataSetChanged();
}
或者您可以简单地从 filesList 中删除项目并在适配器
中调用 notifyDataSetChanged()
当您删除文件时,请确保您更新了包含引用的列表。在你的情况下,很可能在从存储中删除文件后,它的引用仍然存在于列表中并且你的 RecyclerView 仍然显示它的列表项视图。
例如:如果您将文件的所有引用保存在名为 mFileList 的列表中,那么您需要使用 mFileList.remove() 删除已删除文件的引用,然后使用 notifyDataSetChanged() 更新回收器查看。
我有同样的问题,但如果您使用 androidx
中的 ViewPager
,我有解决方案。您可以从 :
public class ViewPagerAdapter extends FragmentPagerAdapter
至:
public class ViewPagerAdapter extends FragmentStatePagerAdapter
我正在使用 recyclerview 显示 sd 卡中的本地图像和视频,当我从我的片段中删除任何视频或图像时,它已被删除但仍保留在那里。我必须回去显示数据的变化。我的回收站视图不会自动刷新不会自动刷新。谁能告诉我如何解决 这是我的代码。
RecyleAdapter.java
public class SavedRecycleAdapter extends RecyclerView.Adapter<SavedRecycleAdapter.MyViewHolder> {
private static String DIRECTORY_SAVE_MEDIA = "/storage/emulated/0/Folder/";
private ArrayList <File> filesList;
private Activity activity;
Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView videosThumbnail, picturesThumbnail;
ImageButton imageDelete, imageShare, videoShare, videoDelete;
CardView videoCardView, imageCardView;
public MyViewHolder(View itemView) {
super(itemView);
picturesThumbnail = itemView.findViewById(R.id.imagesThumbnailSaved);
videosThumbnail = itemView.findViewById(R.id.videosThumbnailSaved);
imageDelete = itemView.findViewById(R.id.imageDeleteSaved);
imageShare = itemView.findViewById(R.id.imageShareSaved);
videoDelete = itemView.findViewById(R.id.videoDeleteSaved);
videoShare = itemView.findViewById(R.id.videoShareSaved);
videoCardView = itemView.findViewById(R.id.videoCardViewSaved);
imageCardView = itemView.findViewById(R.id.imageCardViewSaved);
}
}
public SavedRecycleAdapter(ArrayList <File> filesList, Activity activity) {
this.filesList = filesList;
this.activity = activity;
}
@Override
public SavedRecycleAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflatedView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.saved_item_view, parent, false);
return new SavedRecycleAdapter.MyViewHolder(inflatedView);
}
@Override
public void onBindViewHolder(final SavedRecycleAdapter.MyViewHolder holder, int position) {
final File currentFile = filesList.get(position);
if (currentFile.toString().endsWith(".mp4")) {
holder.videoCardView.setVisibility(View.VISIBLE);
holder.imageCardView.setVisibility(View.GONE);
Glide.with(activity)
.load(Uri.fromFile(new File(currentFile.getAbsolutePath())))
.into(holder.videosThumbnail);
holder.videoDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File(currentFile.getAbsolutePath());
boolean deleted = file.delete();
//
}
});
holder.videosThumbnail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, VideoViewerActivity.class);
intent.putExtra("video", currentFile.getAbsolutePath());
activity.startActivity(intent);
}
});
holder.videoShare.setOnClickListener(new View.OnClickListener() {
//Do stuff
} else {
holder.videoCardView.setVisibility(View.GONE);
holder.imageCardView.setVisibility(View.VISIBLE);
Glide.with(activity).load(currentFile.getAbsolutePath())
.skipMemoryCache(false)
.crossFade().into(holder.picturesThumbnail);
holder.imageDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File(currentFile.getAbsolutePath());
boolean deleted = file.delete();
holder.picturesThumbnail.setOnClickListener(new View.OnClickListener() {
// Do stuff
holder.imageShare.setOnClickListener(new View.OnClickListener() {
}
}
@Override
public int getItemCount() {
return filesList.size();
}
}
这是我的片段代码
public class SavedStoriesFragment extends Fragment {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
private static final String FILE_PATH = "/storage/emulated/0/Folder/";
public SavedStoriesFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_saved_stories, container, false);
recyclerView=(RecyclerView)v.findViewById(R.id.savedRecyclerView);
layoutManager = new GridLayoutManager(getContext(),2);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addItemDecoration(new ItemDecorationAlbumColumns(
getResources().getDimensionPixelSize(R.dimen.image_list_space),2));
getListFiles(new File(FILE_PATH));
SavedRecycleAdapter ra = new SavedRecycleAdapter(this.getListFiles(new File(FILE_PATH)), getActivity());
recyclerView.setAdapter(ra);
return v;
}
private ArrayList<File> getListFiles(File parentDir) {
ArrayList<File> inFiles = new ArrayList<File>();
File[] files;
files = parentDir.listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().endsWith(".jpg") ||
file.getName().endsWith(".png") ||
file.getName().endsWith(".jpeg")||
(file.getName().endsWith(".mp4") ||
file.getName().endsWith(".gif"))) {
if (!inFiles.contains(file))
inFiles.add(file);
}
}
}
return inFiles;
}
}
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> mFragment = new ArrayList<>();
ArrayList<String> mTitles = new ArrayList<>();
public void addFragments (Fragment fragment,String tabTitles)
{
this.mFragment.add(fragment);
this.mTitles.add(tabTitles);
}
public ViewPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragment.get(position);
}
@Override
public int getCount() {
return mFragment.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles.get(position);
}
}
您需要使用 notifyDataSetChanged()
或 notifyItemRemoved(position)
来通知您的适配器基础数据已更改或特定项目已删除。您可以从 here.
删除某些东西后调用片段方法获取新的 ListFiles 和 notifyDataSetChanged()
例如
片段内部
public void refreshRecyclerView() {
ra.setFilesList(this.getListFiles(new File(FILE_PATH)))
}
内部适配器
public void setFilesList(ArrayList <File> filesList) {
this.filesList = filesList;
notifyDataSetChanged();
}
或者您可以简单地从 filesList 中删除项目并在适配器
中调用notifyDataSetChanged()
当您删除文件时,请确保您更新了包含引用的列表。在你的情况下,很可能在从存储中删除文件后,它的引用仍然存在于列表中并且你的 RecyclerView 仍然显示它的列表项视图。
例如:如果您将文件的所有引用保存在名为 mFileList 的列表中,那么您需要使用 mFileList.remove() 删除已删除文件的引用,然后使用 notifyDataSetChanged() 更新回收器查看。
我有同样的问题,但如果您使用 androidx
中的 ViewPager
,我有解决方案。您可以从 :
public class ViewPagerAdapter extends FragmentPagerAdapter
至:
public class ViewPagerAdapter extends FragmentStatePagerAdapter