【问题标题】:How to autoplay songs in recyclerView?如何在 recyclerView 中自动播放歌曲?
【发布时间】:2017-10-06 12:09:56
【问题描述】:

我正在构建一个音乐播放器应用程序,并在 recyclerView 中填充了来自 sd 卡的歌曲。我也设置了 onClickListeners。因此,当我单击一个项目(歌曲)时,该特定位置的歌曲开始播放。我想要的是当它完成播放时,我希望像现代音乐播放器一样自动播放下一首歌曲。我知道我必须使用 OnCompletionListener,但我想不通。

我是 Android 新手。

Songs.java(这是一个片段):

public class Songs extends Fragment {

public static final String Broadcast_PLAY_NEW_AUDIO = "com.musicplayer.musicana.PlayNewAudio";
public static final String TAG = "Songs";
RecyclerView recyclerView;
private ArrayList<SongInfoModel> SongList = new ArrayList<SongInfoModel>();
SongAdapter songAdapter;
ScaleInAnimationAdapter alphaAdapter;
MediaPlayer mediaPlayer;
MainActivity mainActivity;
private MediaPlayerService player;
boolean serviceBound = false;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.songs_activity, container, false);

  //  Activity activity = getActivity();

    final MainActivity activity=(MainActivity)getActivity();


    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(linearLayoutManager);


    songAdapter = new SongAdapter(getContext(), SongList, new SongAdapter.RecyclerItemClickListener() {
        @Override
        public void onClickListener(SongInfoModel song, int position) {

            Toast.makeText(getContext(), song.getSongName(), Toast.LENGTH_SHORT).show();

            Activity activity = getActivity();
            if (activity instanceof MainActivity) {

                mainActivity = (MainActivity) activity;
                mainActivity.setsongText(song);
                ((MainActivity) activity).ButtonPause();

            }
            prepareSong(song);



        }

        @Override
        public void onLongClickListener(SongInfoModel song, int position) {
            Toast.makeText(getContext(), "You long clicked me, thank you!", Toast.LENGTH_SHORT).show();
        }


    });

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
    Cursor cursor = getActivity().getContentResolver().query(uri, null, selection, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                Long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
                Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);



                SongInfoModel s = new SongInfoModel(name, artist, null, null, null, duration, data,albumArtUri);
                SongList.add(s);

            } while (cursor.moveToNext());
        }


        cursor.close();

        Collections.sort(SongList, new Comparator<SongInfoModel>() {
            @Override
            public int compare(SongInfoModel lhs, SongInfoModel rhs) {
                return lhs.getSongName().compareTo(rhs.getSongName());
            }
        });



    }


    alphaAdapter = new ScaleInAnimationAdapter(songAdapter);
    alphaAdapter.setDuration(1000);
    alphaAdapter.setInterpolator(new OvershootInterpolator());
    alphaAdapter.setFirstOnly(false);
    recyclerView.setAdapter(alphaAdapter);
    alphaAdapter.notifyDataSetChanged();


    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);



    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            togglePlay(mp);
        }
    });

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {




        }
    });

    activity.setOnSongClickListener(new MainActivity.OnSongCickListener() {
        @Override
        public void onsongClicked() {
            if(mediaPlayer.isPlaying() && mediaPlayer!=null ){

                mediaPlayer.pause();
                activity.ButtonPlay();


            } else {

                mediaPlayer.start();
                activity.ButtonPause();

            }
        }
    });




    return view;
}




private void prepareSong(SongInfoModel song) {


    mediaPlayer.reset();


    try {
        mediaPlayer.setDataSource(song.getData());
        mediaPlayer.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void togglePlay(MediaPlayer mp) {

    if (mp.isPlaying()) {
        mp.stop();

        mp.reset();
    } else {

        mp.start();


    }


}

SongAdapter.java(recyclerVIews 适配器):

public class SongAdapter extends RecyclerView.Adapter<SongAdapter.SongHolder> {

ArrayList<SongInfoModel> SongList = new ArrayList<>();
Context context;
private RecyclerItemClickListener listener;





public SongAdapter(Context context, ArrayList<SongInfoModel> SongList, RecyclerItemClickListener listener) {

    this.context = context;
    this.SongList = SongList;
    this.listener = listener;

}




@Override
public SongAdapter.SongHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.row_song, parent, false);
    return new SongHolder(view);
}

@Override
public void onBindViewHolder(final SongAdapter.SongHolder holder, final int position) {



    final SongInfoModel songInfoModel = SongList.get(position);

    if(songInfoModel!= null){

     holder.songName.setText(songInfoModel.SongName);
     holder.artistName.setText(songInfoModel.ArtistName);
     holder.duration.setText(String.valueOf(songInfoModel.duration));
     String duration = Utility.convertDuration(songInfoModel.getDuration());
     holder.duration.setText(duration);
        Picasso.with(context).load(songInfoModel.getAlbumID()).placeholder(R.drawable.ic_launcher).into(holder.iv_artwork);

        holder.bind(songInfoModel, listener);
    }

}

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

public class SongHolder extends RecyclerView.ViewHolder  {
    TextView songName;
    TextView artistName;
    TextView duration;
    private ImageView iv_artwork;


    public SongHolder(View itemView)    {

        super(itemView);
        songName = (TextView)itemView.findViewById(R.id.SongName);
        artistName= (TextView)itemView.findViewById(R.id.ArtistName);
        duration = (TextView) itemView.findViewById(R.id.duration);
        iv_artwork = (ImageView) itemView.findViewById(R.id.iv_artwork);

    }

    public void bind(final SongInfoModel songInfoModel, final RecyclerItemClickListener listener) {
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClickListener(songInfoModel, getLayoutPosition());

            }
        });

        itemView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View view) {

                listener.onLongClickListener(songInfoModel, getLayoutPosition());
                return true;
            }
        });

    }



}




public interface RecyclerItemClickListener{

   void onClickListener(SongInfoModel song, int position);
    void onLongClickListener(SongInfoModel song, int position);

}







}

【问题讨论】:

    标签: java android android-recyclerview android-music-player


    【解决方案1】:

    你可以像这样使用媒体播放器的完成监听器

    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
               //pass the path of the new song here
            }
        });
    

    【讨论】:

    • 是的,我知道,但是使用我的代码,我无法弄清楚如何传递下一首歌曲的位置,以便媒体播放器播放它。你能看看我的代码并告诉我吗?我知道这很愚蠢,但我是新手!
    • 当您播放某首歌曲时,您有 SongList,然后保存该歌曲的索引。例如,您现在在调用 onCompletion 时播放歌曲索引 5,您只需要播放下一个索引歌曲 songindex++ 即 6 ..
    • 你把歌曲的路径保存在Arraylist里了吗?
    • 我知道它背后的逻辑兄弟,问题是我无法实现它。这就是为什么我要求你查看我的代码。
    【解决方案2】:

    我刚刚找到了解决方案!很简单!

    在 SongAdapter.java 中:添加这个,

    private int selectedPosition;
    
     public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
    }
    
    public int getSelectedPosition() {
        return selectedPosition;
    }
    

    在 Songs.java 中:添加这个,

     private void changeSelectedSong(int index){
        songAdapter.notifyItemChanged(songAdapter.getSelectedPosition());
        currentIndex = index;
        songAdapter.setSelectedPosition(currentIndex);
        songAdapter.notifyItemChanged(currentIndex);
    
    }
    
    
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
    
    
    
                if(currentIndex + 1 < SongList.size()){
                    SongInfoModel next = SongList.get(currentIndex + 1);
                    changeSelectedSong(currentIndex+1);
                    prepareSong(next);
                    mainActivity.setsongText(next);
                }else{
                    SongInfoModel next = SongList.get(0);
                    changeSelectedSong(0);
                    prepareSong(next);
                    mainActivity.setsongText(next);
                }
    
    
    
            }
        });
    

    并在 onClick 中调用 changeSelectedSong(position)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多