2017-08-17 1 views
0

Ich habe die Erlaubnis enthält externe Speicher in einem offenkundigenLeere RecyclerView während MP3-Dateien von Android-Gerät lesen

PlaylistActivity.java

public class PlaylistActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private SongsAdapter songsAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_playlist); 
     recyclerView=(RecyclerView)findViewById(R.id.playlistactivityrecyclerview); 
     songsAdapter=new SongsAdapter(); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
     recyclerView.setAdapter(songsAdapter); 
     Toast.makeText(getApplicationContext(),"Hi",Toast.LENGTH_LONG).show(); 
    } 
} 

SongsAdapter

public class SongsAdapter extends RecyclerView.Adapter<SongsAdapter.MyViewHolder>{ 

    SongsManager songsManager; 
    String MEDIA_PATH = Environment.getExternalStorageDirectory() + ""; 
    ArrayList<HashMap<String, String>> songList=new ArrayList<>();; 



    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     return new MyViewHolder(view); 

    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     songsManager=new SongsManager(); 

     songList =songsManager.getPlayList(MEDIA_PATH); 
     if (songList != null) { 
      for (int i = 0; i < songList.size(); i++) { 
       String fileName = songList.get(i).get("file_name"); 
       String filePath = songList.get(i).get("file_path"); 
       holder.textView.setText(fileName); 

      } 

     } 


    } 

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

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private TextView textView; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      textView=(TextView)itemView.findViewById(R.id.listitemtextview); 

     } 

     @Override 
     public void onClick(View v) { 

     } 
    } 

} 

SongsManager

public class SongsManager { 


    public ArrayList<HashMap<String, String>> getPlayList(String rootPath) { 
     ArrayList<HashMap<String, String>> fileList = new ArrayList<>(); 

     try { 
      File rootFolder = new File(rootPath); 
      File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this. 
      for (File file : files) { 
       if (file.isDirectory()) { 
        if (getPlayList(file.getAbsolutePath()) != null) { 
         fileList.addAll(getPlayList(file.getAbsolutePath())); 
        } else { 
         break; 
        } 
       } else if (file.getName().endsWith(".mp3")) { 
        HashMap<String, String> song = new HashMap<>(); 
        song.put("file_path", file.getAbsolutePath()); 
        song.put("file_name", file.getName()); 
        fileList.add(song); 
       } 
      } 
      return fileList; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 
lesen

Ich versuche, alle mp3-Dateien von meinem Android-Gerät zu lesen. Der Lesecode funktioniert. Aber wenn ich Recyclerview verwenden, wird es nicht angezeigt. Ich habe die gelesene externe Speicherberechtigung in manifest.Bitte helfen

+0

Vor Initialisierung Recycler Ansicht lesen Sie zuerst alle MP3-Dateien legen Sie dann die Liste Recycler Ansicht –

+0

Didnt erhalten you.Can Sie bitte posten die Veränderungen – Cycle

Antwort

0

Das Problem mit Ihrem Code ist die Aufnahme der Songs Daten in OnBindViewHolder-Methode und da es jedes Mal aufgerufen wird kann es das Problem produzieren.Für weitere Informationen überprüfen RecyclerView.Adapter#onBindViewHolder Vor der Initialisierung Recycler-Ansicht zuerst lesen Sie alle mp3-Dateien und dann Liste auf Recycler anzeigen und zugreifen diese Gegenstände entsprechend.

Ändern Sie Ihre Codes wie folgt, es wird funktionieren.

PlaylistActivity.java

public class PlaylistActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private SongsAdapter songsAdapter; 
    SongsManager songsManager; 
    String MEDIA_PATH = Environment.getExternalStorageDirectory() + ""; 
    ArrayList<HashMap<String, String>> songList=new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_playlist); 
     recyclerView=(RecyclerView)findViewById(R.id.playlistactivityrecyclerview); 
     songsManager=new SongsManager(); 
    songList =songsManager.getPlayList(MEDIA_PATH); 
     songsAdapter=new SongsAdapter(songList); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
     recyclerView.setAdapter(songsAdapter); 
     Toast.makeText(getApplicationContext(),"Hi",Toast.LENGTH_LONG).show(); 
    } 
} 

SongsAdapter

public class SongsAdapter extends RecyclerView.Adapter<SongsAdapter.MyViewHolder>{ 

    ArrayList<HashMap<String, String>> songList; 

    public SongsAdapter(ArrayList<HashMap<String, String>> songList) 
    { 
    this.songList = songList; 
    } 


    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     return new MyViewHolder(view); 

    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 

     holder.textView.setText(songlist.get(position).get("file_name")); 

     } 


    } 

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

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private TextView textView; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      textView=(TextView)itemView.findViewById(R.id.listitemtextview); 

     } 

     @Override 
     public void onClick(View v) { 

     } 
    } 

} 

SongsManager

public class SongsManager { 


    public ArrayList<HashMap<String, String>> getPlayList(String rootPath) { 
     ArrayList<HashMap<String, String>> fileList = new ArrayList<>(); 

     try { 
      File rootFolder = new File(rootPath); 
      File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this. 
      for (File file : files) { 
       if (file.isDirectory()) { 
        if (getPlayList(file.getAbsolutePath()) != null) { 
         fileList.addAll(getPlayList(file.getAbsolutePath())); 
        } else { 
         break; 
        } 
       } else if (file.getName().endsWith(".mp3")) { 
        HashMap<String, String> song = new HashMap<>(); 
        song.put("file_path", file.getAbsolutePath()); 
        song.put("file_name", file.getName()); 
        fileList.add(song); 
       } 
      } 
      return fileList; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 
0

Sie Fehler machen Adapter Ihrer Recycler Ansicht zu füllen.

Holen Sie sich alle Songliste vor der Einstellung Adapter, das ist songList =songsManager.getPlayList(MEDIA_PATH); in Ihrer Haupttätigkeit.

es nun passieren an Adapter Konstruktor songsAdapter=new SongsAdapter(songlist);

In bindViewHolder des Adapters holder.textView.setText(songlist.get(position).get("file_name"));

Verwandte Themen