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

AfterScrolling

添加Else块时

回收器视图适配器类
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
class BookedSlotsData {
@SerializedName("time")
@Expose
var time: String? = null
}时隙DataModel
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)
}
})发布于 2019-09-02 19:18:58
这是因为这就是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
}这就是你可以解决它的方法。
发布于 2021-03-30 21:59:17
我也有同样的问题,在研究了整个sof之后,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;
}https://stackoverflow.com/questions/57755943
复制相似问题