Java android recyclerview viewholder Mediaplayer处理点击问题
我通过单击项目视图播放音频文件MP3,上一个文件自动停止,但问题是,在单击recyclerview的第三个项目后,第一个项目在其单击时不播放声音,并且在列表的其他一些单击中也发生了相同的问题。我添加了完整的适配器类Java android recyclerview viewholder Mediaplayer处理点击问题,java,android,android-studio,android-mediaplayer,realmrecyclerviewadapter,Java,Android,Android Studio,Android Mediaplayer,Realmrecyclerviewadapter,我通过单击项目视图播放音频文件MP3,上一个文件自动停止,但问题是,在单击recyclerview的第三个项目后,第一个项目在其单击时不播放声音,并且在列表的其他一些单击中也发生了相同的问题。我添加了完整的适配器类 public class RingToneAdapter extends RecyclerView.Adapter<RingToneAdapter.RingToneViewHolder> { //removed declared varaible for t
public class RingToneAdapter extends RecyclerView.Adapter<RingToneAdapter.RingToneViewHolder> {
//removed declared varaible for the sake of post to edit
static final int[] resID = {R.raw.a48, R.raw.funny_hen};
public RingToneAdapter(Context rcntx, List<RingTone_Items> ringtonelist) {
this.rcntx = rcntx;
this.ringtonelist = ringtonelist;
}
@NonNull
@Override
public RingToneViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
view = LayoutInflater.from(rcntx).inflate(R.layout.ringtone_values, viewGroup, false);
RingToneViewHolder ringToneViewHolder = new RingToneViewHolder(view);
return ringToneViewHolder;
}
//playing sounds on recycler view
@Override
public void onBindViewHolder(@NonNull final RingToneViewHolder ringToneViewHolder, final int i) {
final RingTone_Items ringTone_items = ringtonelist.get(i);
ringToneViewHolder.rtv.setText(ringTone_items.getRintonetv());
if (mSelectedItem == i) {
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_pause_black_24dp);
} else {
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
ringToneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.reset();
mp = null;
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
//Intent it = new Intent(rcntx, ViewPager_Data.class);
Intent it = new Intent(rcntx, AndroidViewPagerExample.class);
it.putExtra("POS",i);
it.putExtra("name",ringTone_items.getRintonetv());
rcntx.startActivity(it);
}
});
ringToneViewHolder.iconplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedItem == i) {
mSelectedItem = -1;
oldpossssssss = i;
} else {
mSelectedItem = i;
}
notifyDataSetChanged();
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.reset();
mp = null;
if (oldpossssssss == i) {
} else {
mp = new MediaPlayer();
mp = MediaPlayer.create(rcntx, resID[i]);
mp.start();
}
} else {
mp = new MediaPlayer();
mp = MediaPlayer.create(rcntx, resID[i]);
mp.start();
}
}
});
}
@Override
public int getItemCount() {
return ringtonelist.size();
}
class RingToneViewHolder extends RecyclerView.ViewHolder {
private TextView rtv, hello, close;
private ImageView iconplay;
public RingToneViewHolder(@NonNull View itemView) {
super(itemView);
rtv = itemView.findViewById(R.id.ringtitle);
iconplay = itemView.findViewById(R.id.playicon);
}
}
如何根据相应的“播放媒体文件”来顺利地管理此操作。我哪里做错了,请帮助我,谢谢。我建议您在您的视盘中使用单音媒体播放器。首先,使用多个准备好的媒体播放器的内存效率不是很高。其次,它将允许您解决在后台播放声音的问题,因为一个mediaPlayer一次只能播放一个音频
ringToneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.reset();
mp.release();
mp = null;
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
//Intent it = new Intent(rcntx, ViewPager_Data.class);
Intent it = new Intent(rcntx, AndroidViewPagerExample.class);
it.putExtra("POS",i);
it.putExtra("name",ringTone_items.getRintonetv());
rcntx.startActivity(it);
}
});
ringToneViewHolder.iconplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedItem == i) {
oldpossssssss = i;
} else {
mSelectedItem = i;
}
notifyDataSetChanged();
if (oldpossssssss == i) {
if(mp != null){
if(mp.mp.isPlaying()){
mp.pause();
} else{
mp.start();
}
}
} else {
createMediaPlayer(i)
}
}
});
创建MediaPlayer时使用此方法
private void createMediaPlayer(int i)
{
if (mp!=null)
{
if(mp.isPlaying())
{
mp.stop();
mp.reset();
mp.release();
mp=null;
}
}
mp = new MediaPlayer();
mp = MediaPlayer.create(rcntx, resID[i]);
mp.start();
}
可能是它的工作。你能发布整个适配器代码吗?试图编辑整个适配器代码,但它给我错误…第一次我上传到那里,所以这些问题发生了。没有问题解决错误,并按照说明根据错误发布,否则没有人能理解你的问题并查看下面给出的答案还有。@TanveerMunir现在我已经编辑了完整的适配器类。好的,我必须看一下。对不起,先生,我不明白你想说什么……我是初学者……所以我想这就是为什么我不能understand@FaizaZubair他试图说,在新MediaPlayer的一个对象上创建使用对它的操作停止并播放,因为它没有内存效率。