【问题标题】:Why can't I implement a file browser in a fragment?为什么我不能在片段中实现文件浏览器?
【发布时间】:2023-03-06 04:20:01
【问题描述】:

我正在构建一个音乐应用程序,它有一个标签布局,标签是作为片段实现的。我使用 RecyclerView 在其中一个片段(MyFiles.java)中创建了一个文件浏览器。它显示了目录和文件,但问题是当我单击任何没有进入目录的目录时

截图如下:

MyFiles.java

public class My_Files extends Fragment {


private static final String TAG = "My_Files";

RecyclerView recyclerView_files;
private ArrayList<MyFilesModel> item = new ArrayList<>();
private ArrayList<String> path = new ArrayList<>();
private String root;
private TextView myFilesPath;
MyFilesAdapter myFilesAdapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_files_activity, container, false);

    recyclerView_files = view.findViewById(R.id.recyclerView_files);
    myFilesPath = view.findViewById(R.id.myFilesPath);
    root = Environment.getExternalStorageDirectory().getPath();

    LinearLayoutManager mlinearLayoutManager = new LinearLayoutManager(getContext());
    recyclerView_files.setLayoutManager(mlinearLayoutManager);




    MyFilesAdapter myFilesAdapter = new MyFilesAdapter(getContext(), item, new MyFilesAdapter.FilePickerListener() {
        @Override
        public void onClickListener(MyFilesModel myFilesModel, int positionFiles) {

            File file = new File(path.get(positionFiles));

            if (file.isDirectory())
            {
                if(file.canRead()){

                    getDir(path.get(positionFiles));

                }else{

                    Toast.makeText(getContext(), "Can't open", Toast.LENGTH_SHORT).show();
                }
            }else {

                //play music


            }


        }
    });

    getDir(root);

    recyclerView_files.setAdapter(myFilesAdapter);

    return view;
}


private void getDir(String dirPath)

{

    myFilesPath.setText("Location: " + dirPath);


    MyFilesModel myFilesModel;




    File f = new File(dirPath);

    File[] files = f.listFiles();



    if(!dirPath.equals(root))

    {

        myFilesModel = new MyFilesModel(root);


        item.add(myFilesModel);


        path.add(root);

        myFilesModel = new MyFilesModel("../");

        item.add(myFilesModel);

        path.add(f.getParent());



    }



    for(int i=0; i < files.length; i++)

    {

        File file = files[i];

        String filename = file.getName();
        String ext = filename.substring(filename.lastIndexOf('.') + 1, filename.length());

        if (!file.isHidden() && file.canRead()) {






                path.add(file.getPath());


                if (file.isDirectory()) {



                    myFilesModel = new MyFilesModel(file.getName() + "/");


                    item.add(myFilesModel);


                } else {

                    if (ext.equals("mp3") || ext.equals("MP3")) {

                        myFilesModel = new MyFilesModel(file.getName());


                        item.add(myFilesModel);

                    }
                }

              myFilesAdapter.notifyDataSetChanged();

        }



    }



}

MyFilesAdapter.java:

public class MyFilesAdapter extends RecyclerView.Adapter<MyFilesAdapter.MyFilesHolder> {

Context fContext;
ArrayList<MyFilesModel> FileList = new ArrayList<>();
private FilePickerListener filePickerListener;

public MyFilesAdapter(Context fContext, ArrayList<MyFilesModel> fileList, MyFilesAdapter.FilePickerListener filePickerListener) {
    this.fContext = fContext;
    FileList = fileList;
    this.filePickerListener = filePickerListener;
}

@Override
public MyFilesAdapter.MyFilesHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View fView = LayoutInflater.from(fContext).inflate(R.layout.row_myfiles, parent, false);

    return new MyFilesHolder(fView);
}

@Override
public void onBindViewHolder(MyFilesAdapter.MyFilesHolder holder, int position) {

    final MyFilesModel myFilesModel = FileList.get(position);

    holder.myFilesText.setText(myFilesModel.getFileFolderName());

    holder.bindFile(myFilesModel, filePickerListener);

}

@Override
public int getItemCount() {
    return FileList.size();
}

public class MyFilesHolder extends RecyclerView.ViewHolder {

    ImageView myFilesImage;
    TextView myFilesText;

    public MyFilesHolder(View itemView) {
        super(itemView);

        myFilesImage = itemView.findViewById(R.id.myFilesImage);

        myFilesText = itemView.findViewById(R.id.myFilesText);



    }

    public void bindFile(final MyFilesModel myFilesModel, final FilePickerListener filePickerListener) {

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                filePickerListener.onClickListener(myFilesModel, getLayoutPosition());
            }
        });

    }

}

public interface FilePickerListener{

    void onClickListener( MyFilesModel myFilesModel, int positionFiles);

}

【问题讨论】:

  • 如果您在 /storage/emulated/0/Android 中,我会看到 Music 和 Download 之类的目录,因为它们从不在 Android 目录中,这很奇怪。开始已经错了。
  • 0 是内部存储,所以它当然会显示这些文件夹!我已经使用 ListView(不使用片段)尝试了这段代码并且它正在工作,但我似乎无法弄清楚 recyclerView(带有片段)
  • 但我看到了.../Android。如果我看到 Android 是什么意思?通常,然后会显示 Android 目录的内容。你可以详细说明一下。
  • 供你参考-android-er.blogspot.in/2012/07/…你可以看看
  • 如果你懒得解释..再见。

标签: android android-fragments android-recyclerview android-music-player file-browser


【解决方案1】:

在将文件添加到列表后,即在 getDir(..) 方法中,您需要调用 adapter.notifyDataSetChanged()

public class My_Files extends Fragment {


private static final String TAG = "My_Files";

RecyclerView recyclerView_files;
private ArrayList<MyFilesModel> item = new ArrayList<>();
private ArrayList<String> path = new ArrayList<>();
private String root;
private TextView myFilesPath;
MyFilesAdapter myFilesAdapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_files_activity, container, false);

    recyclerView_files = view.findViewById(R.id.recyclerView_files);
    myFilesPath = view.findViewById(R.id.myFilesPath);
    root = Environment.getExternalStorageDirectory().getPath();

    LinearLayoutManager mlinearLayoutManager = new LinearLayoutManager(getContext());
    recyclerView_files.setLayoutManager(mlinearLayoutManager);




    myFilesAdapter = new MyFilesAdapter(getContext(), item, new MyFilesAdapter.FilePickerListener() {
        @Override
        public void onClickListener(MyFilesModel myFilesModel, int positionFiles) {

            File file = new File(path.get(positionFiles));

            if (file.isDirectory())
            {
                if(file.canRead()){

                    getDir(path.get(positionFiles));

                }else{

                    Toast.makeText(getContext(), "Can't open", Toast.LENGTH_SHORT).show();
                }
            }else {

                //play music


            }


        }
    });

    getDir(root);

    recyclerView_files.setAdapter(myFilesAdapter);

    return view;
}


private void getDir(String dirPath)

{

    myFilesPath.setText("Location: " + dirPath);


    MyFilesModel myFilesModel;




    File f = new File(dirPath);

    File[] files = f.listFiles();



    if(!dirPath.equals(root))

    {

        myFilesModel = new MyFilesModel(root);


        item.add(myFilesModel);


        path.add(root);

        myFilesModel = new MyFilesModel("../");

        item.add(myFilesModel);

        path.add(f.getParent());



    }



    for(int i=0; i < files.length; i++)

    {

        File file = files[i];

        String filename = file.getName();
        String ext = filename.substring(filename.lastIndexOf('.') + 1, filename.length());

        if (!file.isHidden() && file.canRead()) {






            path.add(file.getPath());


            if (file.isDirectory()) {



                myFilesModel = new MyFilesModel(file.getName() + "/");


                item.add(myFilesModel);


            } else {

                if (ext.equals("mp3") || ext.equals("MP3")) {

                    myFilesModel = new MyFilesModel(file.getName());


                    item.add(myFilesModel);

                }
            }

            myFilesAdapter.notifyDataSetChanged();

        }



    }



}

【讨论】:

  • 您不必创建适配器的新实例。您需要更新您设置为 RecyclerView 的适配器。
  • 我只有一个实例。
  • 我已经更新了我的答案,请查看。您正在 onCreateView(..) 中创建一个新实例,并使用您在 Fragment 级别创建的实例更新适配器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2017-02-02
相关资源
最近更新 更多