2017-08-17 64 views
0

mp3文件我已经包含许可清单中空RecyclerView一边阅读从Android设备

读取外部存储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; 
     } 
    } 
} 

我试图从我的android设备读取所有mp3文件。阅读代码work.But当我使用recyclerview它不会显示在它上面。我已包括读取外部存储权限在manifest.Please帮助

+0

的初始化回收观点之前,先读所有的MP3文件然后设置列表以回收视图 –

+0

没有得到you.Can请您发表变化 – Cycle

回答

0

你的代码的问题是你在onBindViewHolder方法中的歌曲数据,因为它是每次被调用可能会产生问题。更多信息检查RecyclerView.Adapter#onBindViewHolder在初始化回收站视图之前,先读取所有mp3文件,然后设置列表为回收站视图和访问这些项目相应。

像这样改变你的代码,它会工作。

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

您在填写您的回收鉴于适配器犯错误。

在设置适配器之前获取所有歌曲列表,即songList =songsManager.getPlayList(MEDIA_PATH);在您的主要活动中。

现在通过它使用构造函数适配器 songsAdapter=new SongsAdapter(songlist);

在bindViewHolder适配器holder.textView.setText(songlist.get(position).get("file_name"));