ViewHolder我包含了我的RecycleView的每个项目所需的视图,它们是两个TextView,PlayPauseView和AppCompatSeekBar。在构造函数中,我已将它们初始化为我们布局的ID,并准备好我的Adapter类来扩展它。问题是我有这个PlayPauseView需要在正确的位置切换才能正常工作,因为如果我按下另一个位置的视图,前一个位置仍然会切换。这是一个更好理解的图像。
黄色表示当前正在播放,但两个不能同时播放,所以我希望在RecyclerView项目中获得视图的位置。
这是来自Holder课程
TextView mInstrumentalName, mProducer;
PlayPauseView mPlayButton; // Need to add pause/stop
AppCompatSeekBar mMusicSeekbar;
ItemClickListener itemClickListener;
public TrackHolder(View itemView) {
super(itemView);
mInstrumentalName = (TextView) itemView.findViewById(R.id.instrumental_name);
mProducer = (TextView) itemView.findViewById(R.id.producer);
mPlayButton = (PlayPauseView) itemView.findViewById(R.id.play_pause);
mMusicSeekbar = (AppCompatSeekBar) itemView.findViewById(R.id.music_seekbar);
itemView.setOnClickListener(this);
}
这是来自Adapter类
@Override
public void onBindViewHolder(@NonNull final TrackHolder holder, final int position) {
holder.mInstrumentalName.setText(tracks.get(position).getInstrumentalName());
holder.mProducer.setText(tracks.get(position).getProducer());
holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.mPlayButton.toggle();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (mediaPlayer.isPlaying()) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
mediaPlayer.prepareAsync();
} else {
try {
mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
previous_link = tracks.get(position).getMusicLink();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
mediaPlayer.prepareAsync();
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.release();
}
});
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View v, int pos) {
Toast.makeText(context, Integer.toString(tracks.size()), Toast.LENGTH_SHORT).show();
}
});
}
如果您想在视图持有者课程中获得位置,那么您可以在课堂上调用getAdapterPosition()
。这将返回视图持有者类中单击的位置
我终于找到了解决方案。所以我做了什么,而不是专注于ViewHolder内部的视图,我刷新/更新了RecyclerView中的整个项目,这意味着它将刷新前一项的切换状态。如果将来有人在同一个问题上遇到任何问题,这是一段代码。
private int start_notifying = 0;
private int previous_pos = -1;
因此,开始通知为0是因为您不想刷新项目,直到您至少切换一次播放按钮,并且当您想要按其他列表项目时将当前位置设置为前一个位置。然后递增,以便您可以在下一个按下的项目上开始刷新项目。使用notifyItemChanged(previous_pos)刷新按下的前一个位置的项目,使播放按钮返回到正常状态。
if (start_notifying > 0) {
notifyItemChanged(previous_pos);
previous_pos = position;
} else {
previous_pos = holder.getAdapterPosition();
Log.d("previous_pos", Integer.toString(holder.getAdapterPosition()));
start_notifying++;
}