Cómo seleccionar solamente directorios en rosuH AndroidFilePicker con la implementación de Java

Cómo seleccionar solamente directorios en rosuH AndroidFilePicker con la implementación de Java

El AndroidFilePicker por rosuH es una biblioteca de selección de archivos/carpetas muy útil que está en constante evolución con el objetivo de la integración rápida, alta personalización y flexibilidad de configuración. Lo he estado usando en un proyecto personal donde el usuario debería poder seleccionar archivos y directorios del sistema. Hay un par de ejemplos en la documentación oficial aquí , por ejemplo, el código de Kotlin para lanzar el selector para seleccionar directorios es el siguiente:

FilePickerManager
    .from(this@SampleActivity)
    .maxSelectable(1)
    .filter(object : AbstractFileFilter() {
        override fun doFilter(listData: ArrayList<FileItemBeanImpl>): ArrayList<FileItemBeanImpl> {
            return ArrayList(listData.filter { item ->
                item.isDir
            })
        }
    })
    .skipDirWhenSelect(false)
    .setTheme(R.style.FilePickerThemeReply)
    .forResult(FilePickerManager.REQUEST_CODE)

Sin embargo, no uso Kotlin ya que actualmente estoy trabajando en el desarrollo de plugins usando CapacitorJS, así que me quedaré con Java. En caso de que necesites implementar la misma característica de seleccionar directorios solo con Java usando esta biblioteca, te explicaré cómo hacerlo fácilmente.

1. Implementar clase de filtro

En Kotlin es bastante fácil filtrar elementos de la lista de matrices que se usa para mostrar los elementos en el selector. Con Java es otra historia, ya que requiere un poco más de código. Para comenzar, deberás crear una nueva clase que amplíe la clase AbstractFileFilter del selector de archivos (asegúrate de reemplazar el paquete de acuerdo con el tuyo). En esta clase, debes anular el método doFilter y escribir tu propia lógica personalizada para eliminar/agregar elementos de la lista y devolverlos para mostrarlos en el selector. En este ejemplo, simplemente crearemos un filtro que elimina archivos del selector (mostrando solamente directorios):

// FilterDirectoryOnly.java
package com.useyourown.package.name;

import java.util.ArrayList;
import me.rosuh.filepicker.bean.FileItemBeanImpl;
import me.rosuh.filepicker.config.AbstractFileFilter;

public class FilterDirectoryOnly extends AbstractFileFilter{

    // Sobreescribir el método doFilter

    @Override
    public ArrayList<FileItemBeanImpl> doFilter(ArrayList<FileItemBeanImpl> listData){

        // En esta lógica, devolveremos una nueva lista que contendrá solo los elementos que deseamos
        ArrayList<FileItemBeanImpl> newList = new ArrayList<FileItemBeanImpl>();

        // Iterar sobre cada elemento de la lista
        for (FileItemBeanImpl fileItem: listData) {

            // Si el elemento es un directorio, inclúyelo
            if(fileItem.isDir()){
                newList.add(fileItem);
            }
        }

        return newList;
    }
}

2. Inicie solo los directorios de filtrado de FilePicker

Para aplicar el filtro, simplemente debes proporcionar una nueva instancia de nuestra clase de filtro como primer argumento del método de filtro:

// Ejecuta el selector de archivos que define como filtro
// nuestra clase recientemente creada (new FilterDirectoryOnly ())
FilePickerManager.INSTANCE
    .from(this@SampleActivity)
    .maxSelectable(1)
    .skipDirWhenSelect(false)
    .filter(new FilterDirectoryOnly())
    .setTheme(R.style.FilePickerThemeRail)
    .forResult(FilePickerManager.REQUEST_CODE);

Y eso debería ser suficiente para lanzar el selector de archivos que solo permite seleccionar directorios (eliminar el límite de una sola carpeta eliminando el método maxSelectable).

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable