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