滚动RecyclerView时,其中的项目会自动更改

时间:2019-09-02 11:11:58

标签: android kotlin android-recyclerview

我是Kotlin的新手,正在使用它的一个与预订约会相关的新项目。我在做一些滚动数据时,将一个已预订的空位清单数据与“回收者视图”项目的文本进行比较。自动更新

滚动前

enter image description here

AfterScrolling

enter image description here

添加其他块时

enter image description here

回收站视图适配器类

class TimesSlotAdapter(
    val context: Context,
    val timeSlotsList: List<TimeSlots>,
    val filledSlotList: List<BookedSlotsData>
) : RecyclerView.Adapter<TimesSlotAdapter.ViewHolder>() {
    private var mItemClickListener: OnItemClickListener? = null
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        return ViewHolder(
            LayoutInflater.from(
                context
            ).inflate(R.layout.item_timeslots, parent, false)
        )
    }

    override fun getItemCount() = timeSlotsList.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(timeSlotsList[position])

        for (timeSlots in filledSlotList) {
            if (holder.textView.text.toString().equals(timeSlots.time.toString())) {
                Log.i("time1",timeSlots.time.toString())
                Log.i("time2",holder.textView.text.toString())
                holder.card.setBackground(context.resources.getDrawable(R.drawable.card_background))
                holder.itemView.isEnabled=false
            }
        }

        holder.itemView.setOnClickListener {
            mItemClickListener!!.onItemClick(
                holder.itemView,
                position,
                timeSlotsList[position]
            )
        }
    }

    interface OnItemClickListener {
        fun onItemClick(view: View, position: Int, model: TimeSlots)
    }

    fun SetOnItemClickListener(mItemClickListener: OnItemClickListener) {
        this.mItemClickListener = mItemClickListener
    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        var textView: TextView = itemView.findViewById(R.id.timeSlots)
        var card: CardView = itemView.findViewById(R.id.card)
        fun bind(timeSlots: TimeSlots) {
            textView.text = timeSlots.name
        }

        init {
            itemView.setOnClickListener(this)
        }

        //4
        override fun onClick(v: View) {

        }
    }

}

预订的广告位数据模型

class BookedSlotsData {

    @SerializedName("time")
    @Expose
    var time: String? = null

}

时隙数据模型

data class TimeSlots(val name: String?)

适配器初始化

val adapter =
                TimesSlotAdapter(activity, viewModel.oldFilteredMorningTime, bookedTime)
            recyclerView.adapter = adapter

            adapter.SetOnItemClickListener(object : TimesSlotAdapter.OnItemClickListener {
                override fun onItemClick(view: View, position: Int, model: TimeSlots) {
                    var intent = Intent(context, AppointmentDetailsActivity::class.java)
                    intent.putExtra("Time Slots", model.name)
                    startActivity(intent)
                }

            })

2 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为RecyclerView的工作原理是,无论滚动还是仅使用当前加载的屏幕数据到内存中,它都会回收视图。

当您滚动到最底端并出现位置不匹配时,您会在Item中看到一些奇怪而出乎意料的结果。

您可以简单地通过为设计更改条件提供else块来解决此问题,就像在onBindViewHolder中一样

         if (holder.textView.text.toString().equals(timeSlots.time.toString())) {
                Log.i("time1",timeSlots.time.toString())
                Log.i("time2",holder.textView.text.toString())

 holder.card.setBackground(context.resources.getDrawable(R.drawable.card_background))
                holder.itemView.isEnabled=false
            }
           else{
 holder.card.setBackground(context.resources.getDrawable(//your another drawable))
                holder.itemView.isEnabled=true
            }

这就是解决问题的方法。

答案 1 :(得分:0)

我有同样的问题,在研究了整个沙发后,holder.setIsRecyclable(false);对我有用..

这是我在该适配器中的 oncreateviewholder 的示例.. 祝你好运:)

  View itemView = LayoutInflater.from(context)
            .inflate(R.layout.layout_time_slot, viewGroup, false);
    MyViewHolder holder = new MyViewHolder(itemView);

    holder.setIsRecyclable(false);

    return holder;
}