Tengo una aplicación que usa una vista de lista para mostrar todos los archivos de audio en una carpeta. ¡Esto está funcionando con éxito! Ahora estoy intentando agregar un método para filtrar ArrayList, para mostrar sólo las canciones que coinciden con una Cadena ingresada por el usuario. Desafortunadamente, recibo un mensaje "no se puede resolver el método toLowerCase (java.util.Locale)".

También estoy mirando otras publicaciones de StackOverFlow sobre el filtrado de ArrayLists, pero esas instancias son lo suficientemente diferentes como para que mi cerebro semi-principiante esté confundido sobre cómo aplicar esas respuestas a mi código.

Aquí está el archivo SongsManager.java completo (el método de filtro está al final):

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

public class SongsManager {

    private HashMap<String, String> song;
    private String songString;

    // SDCard Path
    final String MEDIA_PATH = "/storage/extSdCard/music";
    private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    // Constructors
    public SongsManager(String song){
        this.songString = songString;
    }

    public SongsManager(){
    }

    /**
     * Function to read all mp3 files from sdcard
     * and store the details in ArrayList
     * */
    public ArrayList<HashMap<String, String>> getPlayList(){
        File home = new File(MEDIA_PATH);

        if (home.listFiles(new FileExtensionFilter()).length > 0) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<String, String>();
                song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
                song.put("songPath", file.getPath());

                // Adding each song to SongList
                songsList.add(song);
            }
        }
        // return songs playlist_item array
        return songsList;
    }

    public String getSong() {
        return this.songString;
    }

    /**
     * Class to filter files which are having .mp3 extension
     * */
    class FileExtensionFilter implements FilenameFilter {
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3") || name.endsWith(".MP3") || name.endsWith(".wma"));
        }
    }

  // Filter Class
public ArrayList<HashMap<String, String>> filter(String searchString) {
    searchString = searchString.toLowerCase(Locale.getDefault());

    songsList.clear();
    songsList = getPlayList();

    //searchString is empty, so show all songs in results
    if (searchString.length() == 0) {

        if (filteredSongsList != null){
            filteredSongsList.clear();
        }
        filteredSongsList = songsList;
    }

    //only return songs that match the search string
    else {

        if (filteredSongsList != null){
            filteredSongsList.clear();
        }

        for (HashMap<String, String> song : songsList) {
            if (song != null) {
                String songTitle = song.get("songTitle");
                if (songTitle.toLowerCase().contains(searchString)) {
                    filteredSongsList.add(song);
                }
            }
        }
    }

    return filteredSongsList;
}
0
joshgoldeneagle 27 ene. 2016 a las 00:38

2 respuestas

La mejor respuesta

Resolución: se recuperó songTitle String de HashMap y se aplicó el método toLowerCase a la songTitle String:

// Filter Class
    public ArrayList<HashMap<String, String>> filter(String searchString) {
        searchString = searchString.toLowerCase(Locale.getDefault());

    songsList.clear();
    songsList = getPlayList();

    //searchString is empty, so show all songs in results
    if (searchString.length() == 0) {

        if (filteredSongsList != null){
            filteredSongsList.clear();
        }
        filteredSongsList = songsList;
    }

    //only return songs that match the search string
    else {

        if (filteredSongsList != null){
            filteredSongsList.clear();
        }

        for (HashMap<String, String> song : songsList) {
            if (song != null) {
                String songTitle = song.get("songTitle");
                if (songTitle.toLowerCase().contains(searchString)) {
                    filteredSongsList.add(song);
                }
            }
        }
    }

    return filteredSongsList;
}
0
joshgoldeneagle 27 ene. 2016 a las 03:14

Solo cambia esto:

for (song : songsList)

A esto: [EDITAR]

for (HashMap<String, String s : songsList)
0
633kM 27 ene. 2016 a las 03:17