【问题标题】:How to keep position of recyclerview after calling notifyDataSetChanges method in revyclerview?在recyclerview中调用notifyDataSetChanged方法后如何保持recyclerview的位置?
【发布时间】:2019-11-26 18:27:39
【问题描述】:

我试图在给定位置显示图像,单击该项目后该位置不可见。这就是我保留 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

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:
        recyclerViewState = RecyclerView.getLayoutManager().onSaveInstanceState();
        adapter.notifyDataSetChanged();
        recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
    

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2016-07-15
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多