查看器:
class HomeViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val songName: TextView = view.findViewById(R.id.txtNameSong)
val songArtist: TextView = view.findViewById(R.id.txtNameArtist)
val cardContent: CardView = view.findViewById(R.id.cardContent)
val pauseButton: ImageView = view.findViewById(R.id.pauseButton)
}
适配器:
override fun onBindViewHolder(holder: HomeViewHolder, position: Int) {
val text = songInfoList[position]
holder.songName.text = text[0]
holder.songArtist.text = text[1]
val path = text[2]
holder.cardContent.setOnClickListener {
playMusic(path)
holder.pauseButton.visibility = View.VISIBLE
}
holder.pauseButton.setOnClickListener {
if (mediaPlayer.isPlaying) {
holder.pauseButton.setImageResource(R.drawable.play)
mediaPlayer.pause()
} else {
holder.pauseButton.setImageResource(R.drawable.pause)
mediaPlayer.start()
}
}
}
每当用户单击回收视图上的项目并播放音乐时,就会出现PauseButton
。 当用户单击新项时,我想要消失以前单击的PauseButton
,并出现新条目的PauseButton
。 但是,我做不到。 告诉我怎么做。 每当我单击RecycerView上的新内容时,PauseButton
就会出现在最新的项目上,而消失在上一个项目上。
您需要在RecyclerView.Adapter中保存状态
内部适配器:
private var playingPosition: Int? = null
单击事件发生时:
//Update previously position
playingPosition?.let {
models.get(playingPosition).playingState = false
notifyItemChanged(playingPosition)
}
//update new position
models.get(position).playingState = true
playingPosition = position
notifyItemChanged(position)
此外,您的模型应保持播放状态:`
data class Model(...: Int, ...: String, ..., playingState: Boolean)
OnBindViewHolder内部:
if (model.playingState) view.visibility = View.VISIBLE else view.visibility = VIEW.GONE
在适配器var lastSelectedPos=-1
中添加此内容
尝试使用存储上次选择的位置
holder.pauseButton.setOnClickListener {
if (position != lastSelectedPos) {
holder.pauseButton.setImageResource(R.drawable.pause)
notifyItemChanged(position)
if (lastSelectedPos != -1){
holder.pauseButton.setImageResource(R.drawable.play)
notifyItemChanged(lastSelectedPos)
}
lastSelectedPos = position
} else {
lastSelectedPos = -1
holder.pauseButton.setImageResource(R.drawable.play)
}
}
Current函数只为recyclerview的一个项工作,因此您不能在此执行此操作。 如果你想做,你可以这样做。 您可以将isPlay值添加到SongInfoModel中,当单击播放时,您可以为所有歌曲设置isPlay=false,但当前正在播放的歌曲除外。
所以代码将是这样的:
重写fun OnBindViewWholder(Holder:HomeViewWholder,Position:Int){
val text = songInfoList[position]
holder.songName.text = text[0]
holder.songArtist.text = text[1]
val path = text[2]
holder.cardContent.setOnClickListener {
playMusic(path)
holder.pauseButton.visibility = View.VISIBLE
}
if(songInfoList[position].getIsPlaying){
holder.pauseButton.setVisibility(View.VISIBLE)
}else{
holder.pauseButton.setVisibility(View.GONE)
}
holder.pauseButton.setOnClickListener {
if (mediaPlayer.isPlaying) {
holder.pauseButton.setImageResource(R.drawable.play)
mediaPlayer.pause()
} else {
holder.pauseButton.setImageResource(R.drawable.pause)
mediaPlayer.start()
}
setPlayingSong(position)
}
}
public void setPlayingSong(int pos){
for (int i = 0; i < songInfoList.size; i++){
songInfoList.get(i).setIsPlaying(false);
}
songInfoList.get(pos).setIsPlaying(true);
notifyDataSetChanged();
}