提问者:小点点

如何隐藏上次单击的项目在回收视图中的视图


查看器:

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就会出现在最新的项目上,而消失在上一个项目上。


共3个答案

匿名用户

您需要在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();
}