首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我滚动RecyclerView时,里面的项目会自动更改

当我滚动RecyclerView时,里面的项目会自动更改
EN

Stack Overflow用户
提问于 2019-09-02 19:11:58
回答 2查看 719关注 0票数 0

我是kotlin的新手,使用它是我的一个新项目,它与预订预约有关,我正在比较一个列表的数据,这些数据是预订的插槽与回收器视图项目的文本,当我做一些滚动时,数据会自动更新

BeforeScrolling

AfterScrolling

添加Else块时

回收器视图适配器类

代码语言:javascript
复制
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) {

        }
    }

}

预订的时隙DataModel

代码语言:javascript
复制
class BookedSlotsData {

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

}

时隙DataModel

代码语言:javascript
复制
data class TimeSlots(val name: String?)

适配器初始化

代码语言:javascript
复制
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)
                }

            })
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-02 19:18:58

这是因为这就是RecyclerView的工作方式,当你滚动并只使用当前加载到内存中的屏幕数据时,它会回收你的视图。

只要你滚动到底部,出现你的位置不匹配,你就会在Item中看到一些奇怪和意想不到的结果。

您只需为设计更改条件提供else块即可解决此问题,就像在onBindViewHolder中一样

代码语言:javascript
复制
         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
EN

Stack Overflow用户

发布于 2021-03-30 21:59:17

我也有同样的问题,在研究了整个sof之后,holder.setIsRecyclable(false);对我来说是有效的。

下面是适配器中oncreateviewholder示例。祝你好运:)

代码语言:javascript
复制
  View itemView = LayoutInflater.from(context)
            .inflate(R.layout.layout_time_slot, viewGroup, false);
    MyViewHolder holder = new MyViewHolder(itemView);

    holder.setIsRecyclable(false);

    return holder;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57755943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档