OnItemClickListener не работает должным образом в recyclerView после добавления setTextColor? - PullRequest
0 голосов
/ 14 января 2019

У меня есть фрагмент, который содержит обзор переработчика, который показывает временные интервалы в просмотрах карт, как показано ниже

enter image description here

Что я хочу: , если пользователь щелкает по просмотру карты, слово Доступно меняется на Полный, а цвет текста становится красным, как показано ниже при нажатии на 7:30 слот

enter image description here

Проблема: после добавления setTextColor () к просмотру текста в onbindViewHolder, изменения (текст на «Полный», цвет на красный) относятся к карте, на которую щелкнули, но когда я прокручиваю обзор переработчика, я вижу, что другая карта меняет цвет текста на красный без изменения текста на «Полный» в случайной позиции !!

enter image description here

Код моего адаптера: Класс TimeSlotAdapter (закрытый val timeSlotsList: ArrayList): RecyclerView.Adapter () {

private var mListener: OnItemClickListener? = null

interface OnItemClickListener {
          fun onItemClick(position: Int)
}

fun setOnItemClickListener (listener: OnItemClickListener) {
    mListener = listener
}

class TimeSlotViewHolder(card: View, listener: OnItemClickListener?): RecyclerView.ViewHolder(card){

    var mCardTime: TextView = card.findViewById(R.id.timeTV)
    var mAvailability: TextView = card.findViewById(R.id.availabilityTV)

    init {

        card.setOnClickListener {
            if (listener != null) {
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    listener.onItemClick(position)
                }
            }
        }
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimeSlotViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.time_slot, parent, false)
    return TimeSlotViewHolder(v, mListener)
}

override fun getItemCount(): Int = timeSlotsList.size

override fun onBindViewHolder(holder: TimeSlotViewHolder, position: Int) {
    val currentItem = timeSlotsList[position]

    holder.mCardTime.text = currentItem.cardTime
    holder.mAvailability.text = currentItem.availability

    if (currentItem.isSelected) {

    // the problem when I add the below
        holder.mAvailability.setTextColor(Color.RED)
    }
}

код фрагмента деятельности: Класс ReserveTimeFragment: Fragment () {

private var timeSlotsList: ArrayList<TimeSlot>? = null

private var mRecyclerView: RecyclerView? = null
private var mAdapter: TimeSlotAdapter? = null
private var mLayoutManager: RecyclerView.LayoutManager? = null

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val view = inflater.inflate(R.layout.fragment_reserve_time, container, false)

    mRecyclerView = view.findViewById(R.id.recyclerViewLO)

    createTimeSlotsList()
    buildRecyclerView()

    return view
}

fun buildRecyclerView() {
    mRecyclerView!!.setHasFixedSize(true)
    mLayoutManager = LinearLayoutManager(activity)
    mAdapter = TimeSlotAdapter(timeSlotsList!!)

    mRecyclerView!!.layoutManager = mLayoutManager
    mRecyclerView!!.adapter = mAdapter

    mAdapter!!.setOnItemClickListener(object : TimeSlotAdapter.OnItemClickListener {
        override fun onItemClick(position: Int) {
            selectedItem(position, "Full", false)
        }
    })
}

fun selectedItem(position: Int, text: String, selected: Boolean) {
    timeSlotsList!![position].changeAvailability(text)
    timeSlotsList!![position].selecteditem(selected)
    mAdapter!!.notifyDataSetChanged()
}

private fun createTimeSlotsList() {
    timeSlotsList = ArrayList()
    timeSlotsList!!.add(TimeSlot("07:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("08:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("08:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("09:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("09:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("10:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("10:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("11:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("11:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("12:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("12:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("13:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("13:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("14:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("14:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("15:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("15:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("16:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("16:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("17:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("17:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("18:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("18:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("19:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("19:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("20:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("20:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("21:00", "Available", false))
    timeSlotsList!!.add(TimeSlot("21:30", "Available", false))
    timeSlotsList!!.add(TimeSlot("22:00", "Available", false))

}

}

Как решить эту проблему, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 14 января 2019
    if (currentItem.isSelected) {

    // the problem when I add the below
        holder.mAvailability.setTextColor(Color.RED)
    }

Я не тестировал этот код, но по своему опыту он должен быть:

    if (currentItem.isSelected) {
        holder.mAvailability.setTextColor(Color.RED)
    } else {
        holder.mAvailability.setTextColor(Color.GREEN)
    }
0 голосов
/ 14 января 2019

Полагаю, у вас просто есть проблемы, связанные с утилизацией.

override fun onBindViewHolder(holder: TimeSlotViewHolder, position: Int) {
    val currentItem = timeSlotsList[position]

    holder.mCardTime.text = currentItem.cardTime
    holder.mAvailability.text = currentItem.availability

    if (currentItem.isSelected) {

    // the problem when I add the below
        holder.mAvailability.setTextColor(Color.RED)
    }
}

Проще говоря, рассмотрим переработанное представление: вы проверите, выбрано ли оно, а затем установите его цвет текста на КРАСНЫЙ. Что если нет?

Вы должны рассмотреть все случаи в onBindViewHolder, что будет означать реализацию оператора else для обработки представления переработчика:

holder.mAvailability.setTextColor(if (currentItem.isSelected) Color.RED else Color.GREEN)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...