Javohir Abdugaffor
Javohir Abdugaffor

Reputation: 1

Organize a hierarchical view of Files using Recycle View

I wanted to implement the same File Manager app on android devices. That is: on the page there will be files and folders, above which is the hierarchical address of the current page (GalleryFragment).

enter image description here

I am new to android and java. I tried some things but it doesn't work:

GalleryFragment.java:

`

public class GalleryFragment extends Fragment {

    private FragmentGalleryBinding binding;

    private FileAdapter fileAdapter;

    private View rootView;

    private ArrayList<File> folderStack = new ArrayList<>();

    private HashMap<String, String> folderHierarchyMap = new HashMap<>();

    private RecyclerView folderHierarchyRecyclerView;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    GalleryViewModel galleryViewModel =
            new ViewModelProvider(this).get(GalleryViewModel.class);

    binding = FragmentGalleryBinding.inflate(inflater, container, false);
    rootView = binding.getRoot();

    return rootView;
}

@Override
public void onResume() {
    super.onResume();
    CreateFileManager();

    String path = Environment.getExternalStorageDirectory().getPath();
    File root = new File(path);
    File[] files = root.listFiles();
    folderStack.add(root);

    setupFolderHierarchyRecyclerView();
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

private void requestPermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText(requireContext(), "Storage permission is required, please allow from settings", Toast.LENGTH_SHORT).show();
    } else {
        ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 111);
        ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 111);
    }
}

private boolean checkPermission() {
    int res = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
    return res == PackageManager.PERMISSION_GRANTED;
}

private void CreateFileManager() {
    String path = Environment.getExternalStorageDirectory().getPath();
    RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
    TextView noFilestextView = rootView.findViewById(R.id.no_files_found);

    File root = new File(path);
    File[] files = root.listFiles();
    fileAdapter = new FileAdapter(requireContext(), files);

    if (files == null || files.length == 0) {
        noFilestextView.setVisibility(View.VISIBLE);
        recyclerView.setAdapter(new FileAdapter(requireContext(), new File[0]));
    } else {
        noFilestextView.setVisibility(View.INVISIBLE);
        recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
        recyclerView.setAdapter(fileAdapter);
    }
}

private void setupFolderHierarchyRecyclerView() {
    folderHierarchyRecyclerView = rootView.findViewById(R.id.folder_hierarchy_recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false);
    folderHierarchyRecyclerView.setLayoutManager(layoutManager);

    if (folderStack != null && !folderStack.isEmpty()) {
        Log.d("FolderHierarchyAdapter", "FolderStack size: " + folderStack.size());

        FolderHierarchyAdapter folderHierarchyAdapter = new FolderHierarchyAdapter(requireContext(), folderStack);
        folderHierarchyRecyclerView.setAdapter(folderHierarchyAdapter);

        folderHierarchyAdapter.setOnItemClickListener(new FolderHierarchyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // Get the selected folder from the folder stack
                File selectedFolder = folderStack.get(position);

                // Navigate to the selected folder
                navigateToFolder(selectedFolder);
            }
        });
    } else {
        Log.d("FolderHierarchyAdapter", "FolderStack is empty or null");
    }
}

private void navigateToFolder(File folder) {
    if (folder.exists() && folder.isDirectory()) {
        folderStack.add(folder);
        File[] files = folder.listFiles();
        if (files != null && files.length > 0) {
            fileAdapter.setFilesAndFolders(files);
            fileAdapter.notifyDataSetChanged();

            // Add folder to the hierarchy dictionary
            folderHierarchyMap.put(folder.getName(), folder.getAbsolutePath());

            // Update the folder hierarchy list
            updateFolderHierarchyList();
        } else {
            Toast.makeText(requireContext(), "Folder is empty or cannot be accessed", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(requireContext(), "Folder does not exist or is not a directory", Toast.LENGTH_SHORT).show();
    }
}

private void updateFolderHierarchyList() {
    ArrayList<File> hierarchyFolders = new ArrayList<>();
    for (String folderName : folderHierarchyMap.keySet()) {
        String folderPath = folderHierarchyMap.get(folderName);
        hierarchyFolders.add(new File(folderPath));
    }

    // Update the folder hierarchy list adapter
    FolderHierarchyAdapter folderHierarchyAdapter = new FolderHierarchyAdapter(requireContext(), hierarchyFolders);
    folderHierarchyRecyclerView.setAdapter(folderHierarchyAdapter);
}
}

`

FileAdapter.java:

`

public class FileAdapter extends RecyclerView.Adapter<FileAdapter.ViewHolder> {

    Context context;
    File[] filesAndFolders;
    private Stack<File> folderStack = new Stack<>();

public FileAdapter (Context context, File[] files) {
    this.context = context;
    this.filesAndFolders = files;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.file_list_item, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    File selectedFile = filesAndFolders[position];
    holder.filename.setText(selectedFile.getName());

    if (selectedFile.isDirectory()) {
        holder.fileicon.setImageResource(R.drawable.baseline_folder_24);
    } else {
        String filename = selectedFile.getName();
        String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();

        if (extension.equals("zip") || extension.equals("rar")) {
            holder.fileicon.setImageResource(R.drawable.baseline_folder_zip_24);
        } else if (isAudioFile(extension)) {
            holder.fileicon.setImageResource(R.drawable.baseline_file_audio_24);
        } else if (isVideoFile(extension)) {
            holder.fileicon.setImageResource(R.drawable.baseline_file_video_24);
        } else if (isImageFile(extension)) {
            holder.fileicon.setImageResource(R.drawable.baseline_file_image_24);
        } else {
            // Set a default icon for other file types
            holder.fileicon.setImageResource(R.drawable.baseline_file_other_24);
        }
    }

    // Set click listener for item
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (selectedFile.isDirectory()) {
                // If it's a directory, navigate into it
                navigateIntoFolder(selectedFile);
            } else {
                // If it's a file, show Toast with file information
                showFileInformation(selectedFile);
            }
        }
    });
}


@Override
public int getItemCount() {
    return filesAndFolders.length;
}


public void setFilesAndFolders(File[] files) {
    this.filesAndFolders = files;
    notifyDataSetChanged();
}


public class ViewHolder extends RecyclerView.ViewHolder {
    TextView filename;
    ImageView fileicon;

    public ViewHolder(View view) {
        super(view);

        filename = view.findViewById(R.id.file_name_text_view);
        fileicon = view.findViewById(R.id.file_icon_view);
    }
}


private void navigateIntoFolder(File folder) {
    // Check if the folder exists and is a directory
    if (folder.exists() && folder.isDirectory()) {
        // Push the current folder to the stack
        folderStack.add(folder);

        // Get the list of files and folders inside the selected folder
        File[] files = folder.listFiles();
        if (files != null && files.length > 0) {
            // Update the filesAndFolders array with the contents of the selected folder
            filesAndFolders = files;
            // Notify the adapter that the data set has changed
            notifyDataSetChanged();
        } else {
            // Handle the case where the folder is empty or cannot be accessed
            Toast.makeText(context, "Folder is empty or cannot be accessed", Toast.LENGTH_SHORT).show();
        }
    } else {
        // Handle the case where the selected folder does not exist or is not a directory
        Toast.makeText(context, "Folder does not exist or is not a directory", Toast.LENGTH_SHORT).show();
    }
}

private void showFileInformation(File file) {
    // Display information about the file via Toast message
    String message = "File Name: " + file.getName() + "\nFile Path: " + file.getAbsolutePath();
    Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}


private boolean isAudioFile(String extension) {
    return extension.equalsIgnoreCase("mp3") || extension.equalsIgnoreCase("wav") ||
            extension.equalsIgnoreCase("ogg") || extension.equalsIgnoreCase("flac") ||
            extension.equalsIgnoreCase("m4a") || extension.equalsIgnoreCase("aac") ||
            extension.equalsIgnoreCase("wma") || extension.equalsIgnoreCase("alac") ||
            extension.equalsIgnoreCase("amr") || extension.equalsIgnoreCase("opus");
}

private boolean isVideoFile(String extension) {
    return extension.equalsIgnoreCase("mp4") || extension.equalsIgnoreCase("avi") ||
            extension.equalsIgnoreCase("mkv") || extension.equalsIgnoreCase("mov") ||
            extension.equalsIgnoreCase("wmv") || extension.equalsIgnoreCase("flv") ||
            extension.equalsIgnoreCase("webm") || extension.equalsIgnoreCase("3gp");
}

private boolean isImageFile(String extension) {
    return extension.equalsIgnoreCase("jpg") || extension.equalsIgnoreCase("jpeg") ||
            extension.equalsIgnoreCase("png") || extension.equalsIgnoreCase("gif") ||
            extension.equalsIgnoreCase("bmp") || extension.equalsIgnoreCase("tiff") ||
            extension.equalsIgnoreCase("svg") || extension.equalsIgnoreCase("webp");
}
}

`

FolderHierarchyAdapter.java:

`

public class FolderHierarchyAdapter extends RecyclerView.Adapter<FolderHierarchyAdapter.ViewHolder> {
    private Context context;
    private ArrayList<File> folderStack;
    private OnItemClickListener listener;

public FolderHierarchyAdapter(Context context, ArrayList<File> folderStack) {
    this.context = context;
    this.folderStack = folderStack;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.folder_hierarchy_item, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    File folder = folderStack.get(position);
    holder.folderName.setText(folder.getName());
    holder.itemView.setOnClickListener(v -> {
        if (listener != null) {
            listener.onItemClick(position);
        }
    });
}

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

public void setOnItemClickListener(OnItemClickListener listener) {
    this.listener = listener;
}

public interface OnItemClickListener {
    void onItemClick(int position);
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    TextView folderName;

    public ViewHolder(View itemView) {
        super(itemView);
        folderName = itemView.findViewById(R.id.folder_name_text_view);
    }
}
}\`

Upvotes: 0

Views: 24

Answers (0)

Related Questions