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