【发布时间】:2025-11-29 21:15:01
【问题描述】:
我拥有的 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);
}
这是来自适配器类
@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();
}
});
}
【问题讨论】:
-
是的,您可以显示您的代码吗?
-
是的,我现在已经添加了。
-
你的问题是什么?
"position of view inside ViewHolder"是什么意思? -
@pskink 就像我希望能够在位置 0 中重新切换 PlayPauseView,同时在位置 2 中切换 PlayPauseView。
-
所以使用
ViewHolder#getAdapterPosition()方法
标签: android android-recyclerview android-viewholder