Android RecyclerView onBindViewHolder Вызывается дважды (впервые при создании адаптера) - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть простой класс RecyclerViewAdapter:

class TariffsCardAdapter(context: Context, tariffCardItems: List<ItemsItem?>?) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

   private var context: Context? = null
   private var tariffCardItems: ArrayList<ItemsItem?>? = null

    init {
      this.context=context
      this.tariffCardItems=tariffCardItems as ArrayList<ItemsItem?>
    }

   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
       val view = LayoutInflater.from(parent.context).inflate(R.layout.layout_tariff_card_items, parent, false)
       return TariffsCardAdapterViewHolder(view)
   }

   override fun getItemCount(): Int {
       return tariffCardItems!!.size
   }//getItemCount ends

   override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

     val viewHolder = holder as TariffsCardAdapterViewHolder
     Log.e("posX","pos:::".plus(position))
   }

   private inner class TariffsCardAdapterViewHolder : RecyclerView.ViewHolder {
      var text: TextView? = null
      constructor(row: View) : super(row) {
         text= row.findViewById(R.id.text) as TextView
      }
   }
}

Теперь предположим, что мой ТарифCardItems: List будет иметь только 5 элементов в списке, которые я хочу показать!

Проблема в том, что когда создается экземпляр адаптера в первый раз; методы onBindViewHolder, вызываемые дважды!

, чтобы значения журнала печатались как:

поз ::: 0

поз ::: 1

поз ::: 0

поз ::: 1

, что означает, что моя позиция просмотра переработчика будет 1 после всего этого! и самое первое представление будет создано с элементом списка с 1 индексом , что неверно и должно быть 0

в простом, самый первый дочерний элемент представления рециркулятора создается на 1 значение позиции, что неверно

Может кто-нибудь выяснить, что я делаю не так

Заранее благодарим и уважаем

1 Ответ

0 голосов
/ 17 апреля 2019

Это просто потому, что вы вызываете адаптер 2 в коде, который держатель bindviewview должен использовать для привязки данных, чтобы не вызывать viewholder.

class TariffsCardAdapter(context: Context, tariffCardItems: List<ItemsItem?>?) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

   private var context: Context? = null
   private var tariffCardItems: ArrayList<ItemsItem?>? = null

    init {
      this.context=context
      this.tariffCardItems=tariffCardItems as ArrayList<ItemsItem?>
    }

   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
       val view = LayoutInflater.from(parent.context).inflate(R.layout.layout_tariff_card_items, parent, false)
       return TariffsCardAdapterViewHolder(view)
   }

   override fun getItemCount(): Int {
       return tariffCardItems!!.size
   }//getItemCount ends

   override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

                //bind data
   }

   private inner class TariffsCardAdapterViewHolder : RecyclerView.ViewHolder {
      var text: TextView? = null
      constructor(row: View) : super(row) {
         text= row.findViewById(R.id.text) as TextView
      }
   }
}

Например, ваш адаптер должен быть таким

class CustomAdapter(val userList: ArrayList<User>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    //this method is returning the view for each item in the list
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.list_layout, parent, false)
        return ViewHolder(v)
    }

    //this method is binding the data on the list
    override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
        holder.bindItems(userList[position])
    }

    //this method is giving the size of the list
    override fun getItemCount(): Int {
        return userList.size
    }

    //the class is hodling the list view
    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bindItems(user: User) {
            val textViewName = itemView.findViewById(R.id.textViewUsername) as TextView
            val textViewAddress  = itemView.findViewById(R.id.textViewAddress) as TextView
            textViewName.text = user.name
            textViewAddress.text = user.address
        }
    }
}

Этот метод из вашего кода вызывается дважды

 val viewHolder = holder as TariffsCardAdapterViewHolder
     Log.e("posX","pos:::".plus(position))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...