从 android 设备读取 mp3 文件时清空 RecyclerView

Empty RecyclerView while reading mp3 files from android device

我在清单中包含了读取外部存储的权限

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();
    }
}

歌曲适配器

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) {

        }
    }

}

歌曲管理器

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 device.The 阅读代码 works.But 中读取所有 mp3 文件,当我使用 recyclerview 时它没有显示在 it.I 上包括了manifest.Please 帮助

中的读取外部存储权限

你的代码的问题是你在 onBindViewHolder 方法中获取歌曲数据,因为每次调用它可能会产生 issue.For 更多信息检查 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();
    }
}

歌曲适配器

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) {

        }
    }

}

歌曲管理器

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;
        }
    }
}

您在填充回收站视图的适配器时出错。

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

现在使用构造函数将其传递给适配器 songsAdapter=new SongsAdapter(songlist);

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