如何为RecyclerView列表项添加点击播放对应音频的功能
问题原因
你当前是给整个RecyclerView控件设置点击事件,而不是给RecyclerView内部的每个子列表项设置点击监听,所以点击不会触发回调,这是功能不生效的核心原因。
解决方案
按以下步骤修改代码即可实现点击对应吉他项播放对应音频:
- 改造Guitar实体类,新增音频资源ID属性:
public class Guitar { private String name; private String imgUrl; // 新增字段,存储对应raw文件夹的音频资源ID private int audioResId; // 构造方法更新 public Guitar(String name, String imgUrl, int audioResId) { this.name = name; this.imgUrl = imgUrl; this.audioResId = audioResId; } // 对应getter方法 public int getAudioResId() { return audioResId; } // 原有其他getter、setter保留 }
- 初始化吉他列表时传入对应音频资源ID:
arrGuitar.add(new Guitar("Nylon String Spanish", "https://inside-guitar.com/wp-content/uploads/2019/05/Savarez-Flamenco-Guitar-Strings.jpg", R.raw.nylon_string)); arrGuitar.add(new Guitar("Steel String Acoustic","https://hearthemusicplay.com/wp-content/uploads/2017/05/steelstringguitar-e1494992902529-1140x638.jpg", R.raw.steel_string)); arrGuitar.add(new Guitar("Electric Guitar","https://cdn.mos.cms.futurecdn.net/papiVxAvWm3QaDAD8fSdqS-970-80.jpg.webp", R.raw.electric_riff));
- 在
GuitarTypesRecyclerViewAdapter的onBindViewHolder方法中给列表项设置点击事件,同时处理MediaPlayer资源释放避免内存泄漏:
// Adapter内定义全局MediaPlayer变量统一管理 private MediaPlayer mediaPlayer; @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Guitar currentGuitar = guitarList.get(position); // 原有给控件赋值名称、加载图片的逻辑保留 // 给列表项根View设置点击监听 holder.itemView.setOnClickListener(v -> { // 先释放之前正在播放的音频资源 if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } // 创建对应音频的MediaPlayer并播放 mediaPlayer = MediaPlayer.create(v.getContext(), currentGuitar.getAudioResId()); mediaPlayer.start(); // 播放完成后自动释放资源 mediaPlayer.setOnCompletionListener(mp -> { mp.release(); mediaPlayer = null; }); }); } // 新增资源释放方法供宿主Activity调用 public void releaseMediaPlayer() { if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } }
- 在宿主Activity的
onDestroy生命周期中调用资源释放方法:
@Override protected void onDestroy() { super.onDestroy(); if (adapter != null) { adapter.releaseMediaPlayer(); } }
如果只是临时测试所有列表项都播放同一个音频,可以不用修改Guitar类,直接在上述第三步的点击事件里把currentGuitar.getAudioResId()替换为固定的R.raw.steel_string即可。
内容的提问来源于stack exchange,提问作者Suvrodip Mukhopadhyay
相关产品推荐
相关产品推荐

