首页 > 解决方案 > 在revylerview中调用notifyDataSetChanges方法后如何保持recyclerview的位置?

问题描述

我试图在给定位置显示图像,单击该项目后该位置不可见。这就是我保留int数组的原因。我给点击位置 1 和其他 0。检查后我使第一个可见而另一个不可见并调用 notifyDataSetChangesethod。recyclerviews 滚动到 0 位置。我希望它保持在相同的位置而不改变。

类 HitParadeAdapter(私有 val 模型:MutableList,私有 val 上下文:上下文,私有 val callBack:HitParadListener):RecyclerView.Adapter(){

private var isPlay = false
private var listName = mutableListOf<String>()
private var listSort = mutableListOf<Voting_tracks>()

private val selectedItems = IntArray(models.size)

private fun setSelectedItem(position: Int) {
    for (i in selectedItems.indices) {
        if (i == position)
            selectedItems[i] = 1
        else
            selectedItems[i] = 0
    }
}

interface HitParadListener{
    fun itemClick(position: Int)
}

init {
    Log.d("Testing", "${models.size}")
    for (i in models.indices){
        listName.add(models[i].name)
    }
    sort(listName)
    for (i in listName.indices){
        Log.d("Sort", listName[i])
    }

    for (i in models.indices){
        for (j in models.indices){
            if (listName[i] == models[j].name){
                listSort.add(models[j])
                break
            }
        }
    }
    models.clear()
    models.addAll(listSort)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParadeViewHolder {
    return ParadeViewHolder(
        LayoutInflater.from(parent.context).inflate(
            R.layout.item_parade,
            parent,
            false
        )
    )
}

override fun getItemCount(): Int {
    return models.size
}

override fun onBindViewHolder(holder: ParadeViewHolder, position: Int) {

        if(selectedItems[position] == 1) holder.play.visibility = View.VISIBLE
        else holder.play.visibility = View.INVISIBLE

    holder.track.text = models[position].name
    holder.artist.text = models[position].artists[0].name
    if (models[position].picture_path != "") {
        Picasso.get().load("http://rusradio.test-rmg.ru${models[position].picture_path}")
            .into(holder.image)
    }


    holder.like.setOnClickListener {
        holder.sendVariants(1)
    }
    holder.disLike.setOnClickListener {
        holder.sendVariants(1)
    }

    holder.itemView.setOnClickListener {
        val positions = holder.adapterPosition
        if (positions != RecyclerView.NO_POSITION) {
            setSelectedItem(positions)
            notifyDataSetChanged()
            callBack.itemClick(position)
        }
    }
}

inner class ParadeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    private val getUsers: GetList = createService()
    val image: AppCompatImageView = itemView.Image
    val artist: AppCompatTextView = itemView.Artist
    val track: AppCompatTextView = itemView.track
    val play: AppCompatImageView = itemView.image_play
    val like: AppCompatImageView = itemView.imageLike
    val disLike: AppCompatImageView = itemView.imageDisLike

标签: androidandroid-recyclerview

解决方案


    recyclerViewState = RecyclerView.getLayoutManager().onSaveInstanceState();
    adapter.notifyDataSetChanged();
    recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);

推荐阅读