【已解决】 如何在recycleview中点击一个item中的播放按钮,让其他的item中的按钮复位,也就是改变背景图片
在写毕设的过程中,想要实现如图,在recycleview中每个item都有一个播放按钮,播放属于自己的那一段音频。正常应该是点击第一个在播放过程中时,点击第二个就会停止第一个,然后播放第二个,但是现在虽然可以立马停止,但是imagebutton的改变跟不上,我在网上搜索得到,说notifyitemchange,可以刷新,但是在模拟器中也只有第一次生效,而在我的手机上则第一次也没有成功变化图标,所以想请问大神们,这个功该如何实现,下面是我的recycleview中adapter的实现。
public class RecordDdapter extends RecyclerView.Adapter<RecordDdapter.ViewHolder> {
private static final String TAG = "adapter";
private List<RecordData> mRecordData ;
private Context mContext;
private MediaPlayer player ;
private boolean mStartPlaying = true;
private int mposition;
public RecordDdapter(Context context,List<RecordData> recordData) {
mContext = context;
mRecordData = recordData;
}
static class ViewHolder extends RecyclerView.ViewHolder{
TextView date;
ImageButton startbutton;
TextView noisetime;
TextView averagedb;
TextView maxdb;
public ViewHolder(@NonNull View itemView) {
super(itemView);
date = itemView.findViewById(R.id.date);
noisetime = itemView.findViewById(R.id.noise_time);
averagedb = itemView.findViewById(R.id.average_db);
maxdb = itemView.findViewById(R.id.max_db);
startbutton = itemView.findViewById(R.id.play);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
ViewHolder viewHolder =new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
RecordData recordData = mRecordData.get(position);
holder.date.setText(recordData.getMdate());
holder.maxdb.setText(recordData.getMaxdb()+"");
holder.averagedb.setText(recordData.getAveragedb()+"");
holder.startbutton.setOnClickListener(new View.OnClickListener() {
final String noisepath = recordData.getPath();
@Override
public void onClick(View view) {
if (mStartPlaying) {
Log.d(TAG, "onClick: start运行开始" +mposition+mStartPlaying);
startPlaying(noisepath, holder.startbutton);
mposition = position;
Log.d(TAG, "onClick: start运行结束" +mposition+mStartPlaying);
} else {
if(mposition == position)
{
stopPlaying(holder.startbutton);
Log.d(TAG, "onClick: 正常stop"+mposition+mStartPlaying);
}
else
{
Log.d(TAG, "onClick: 点击其他的stop开始"+mposition+mStartPlaying);
player.release();//不管如何都要把上一个player给终结了
notifyItemChanged(mposition);
mposition = position;
startPlaying(noisepath, holder.startbutton);
Log.d(TAG, "onClick: 点击其他的stop结束"+mposition+mStartPlaying);
}
}
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
mStartPlaying = !mStartPlaying;
holder.startbutton.setBackground(mContext.getResources().getDrawable(R.drawable.ic_start));
Log.d(TAG, "onCompletion: "+mStartPlaying);
}
});
}
});
}
@Override
public int getItemCount() {
return mRecordData.size();
}
private void startPlaying(String fileName,ImageButton button) {
mStartPlaying = false;
button.setBackground(mContext.getResources().getDrawable(R.drawable.ic_pause));
Log.d(TAG, "startPlaying: "+mStartPlaying);
player = new MediaPlayer();
try {
player.setDataSource(fileName);
player.prepareAsync();//异步装载,不会让页面卡顿,但是用了异步装载就用用下面的回调函数
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
}
}); //不然可能会没有装载完成就start了
} catch (IOException e) {
Log.d(TAG, "prepare() failed");
}
}
private void stopPlaying(ImageButton button) {
if(player != null)
{
player.release();
mStartPlaying = true;
button.setBackground(mContext.getResources().getDrawable(R.drawable.ic_start));
Log.d(TAG, "stopPlaying: "+mStartPlaying);
}
else
Log.d(TAG, "stopPlaying: "+"为空");
}
}
你点击按钮后 刷新一下列表就可以了 notifyDataSetChanged();