Данные из firebase в реальном времени не будут отображаться в моем RecyclerView

#android #firebase #firebase-realtime-database #kotlin-android-extensions #kotlin-extension

#Android #firebase #firebase-realtime-database #kotlin-android-extensions #kotlin-расширение

Вопрос:

Мне нужно отобразить данные из базы данных firebase с помощью RecyclerView. все работает нормально, я вижу карты и все, но на карте не будет и данных.

вот мой класс адаптера:

 class MyAdapter(c: Context, t: ArrayList<Thoughts>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

var context : Context
    var theThoughts : ArrayList<Thoughts>

    init{
        context = c
        theThoughts = t
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(context).inflate(R.layout.card_view01, parent, false))
    }//end onCreateViewHolder

    override fun getItemCount(): Int {
        return theThoughts.size
    }//end getItemCount

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        //holder.theTopicAdapter.text[position]
        //holder.theThoughtAdapter.text[position]
        //it works fine withOUT these two lines up
    }//end onBindViewHolder

    class MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {

        var theTopicAdapter: TextView
        var theThoughtAdapter: TextView

        init{
            //super.itemView
            theTopicAdapter = itemView.textViewCard01
            theThoughtAdapter = itemView.textViewCard02
        }

        fun MyViewHolder(itemView: View){
            super.itemView
            theTopicAdapter = itemView.textViewCard01
            theThoughtAdapter = itemView.textViewCard02
        }//end MyViewHolder function
        }//end MyViewHolder class
}//end MyAdapter class
  

это код, в котором я получаю данные и отображаю их:

 databaseReference.addValueEventListener(object: ValueEventListener {
            override fun onDataChange(p0: DataSnapshot) {
                if (p0.exists()){
                    for (thought in p0.children){
                        //var theTopicGetter = thought.child("theTopic").value.toString()
                        val t: Thoughts = thought.getValue(Thoughts::class.java)!!
                        list.add(t)
                    }//end for loop
                }//end if
                adapter = MyAdapter(this@SeePreviousThoughts, list)
                recyclerView.adapter = adapter
            }//end onDataChange
            override fun onCancelled(p0: DatabaseError) {
                Toast.makeText(this@SeePreviousThoughts, "error, please try again.", Toast.LENGTH_SHORT).show()
            }
        })//end the listener
  

это класс thoughs:

 class Thoughts() {
    lateinit var theID: String
    lateinit var theCode: String
    lateinit var theTopic: String
    lateinit var theThought: String

    constructor(theID: String, theCode: String, theTopic: String, theThought: String) : this() {
            this.theID = theID
            this.theCode = theCode
            this.theTopic = theTopic
            this.theThought = theThought
    }

}
  

Я должен получить данные из базы данных, и они должны отображаться на каждой карте, но карты просто пусты.
это скриншот пустого RecyclerView
слова тема и мысли по умолчанию взяты из XML-файла.

Я предполагаю, что моя проблема в том, что функция MyViewHolder в классе MyViewHolder никогда не используется … скриншот кода, который не используется

Комментарии:

1. Заполните элементы списка onBindViewHolder(holder: MyViewHolder, position: Int) данными из theThougts . Остальная часть кода, похоже, работает.

2. @KarolKulbaka когда я раскомментирую строки в моем onBindViewHolder приложении, происходит сбой. Я отредактирую свой вопрос с помощью того, что я только что нашел. не могли бы вы, пожалуйста, проверить это. большое вам спасибо.

3. прежде всего, правильное заполнение вида будет выглядеть следующим образом: holder.theTopicAdapter.text = theThoughts[position].someTextData

4. Конструктор держателя используется как MyViewHolder(LayoutInflater.from(context).inflate(R.layout.card_view01, parent, false)) . Существуют ли какие-либо различия между вашей текущей реализацией адаптера и рассматриваемым кодом?

5. @KarolKulbaka Спасибо, в onBindViewHolder я сделал то, что вы сказали, и я написал этот код: holder.theTopicAdapter.text = theThoughts[position].toString() он работает лучше, но теперь текст, который я получаю на карточке, указывает мой идентификатор проекта в firebase и некоторые цифры. должен ли я опубликовать это изображение? Кстати, мой класс «Мысли» в firebase содержит 4 элемента, но я хочу отображать только 2 элемента. влияет ли это на результат?

Ответ №1:

Проблема была в override fun onBindViewHolder(holder: MyViewHolder, position: Int) методе. Этот адаптер работает:

 class MyAdapter(val context: Context, val  theThoughts: ArrayList<Thoughts>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(context).inflate(R.layout.card_view01, parent, false))
    }//end onCreateViewHolder

    override fun getItemCount(): Int {
        return theThoughts.size
    }//end getItemCount

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.theTopicAdapter.text = theThoughts[position].theTopic
        holder.theThoughtAdapter.text = theThoughts[position].theThought
    }//end onBindViewHolder

    class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

        lateinit var theTopicAdapter: TextView
        lateinit var theThoughtAdapter: TextView

        fun MyViewHolder(itemView: View){
            super.itemView
            theTopicAdapter = itemView.textViewCard01
            theThoughtAdapter = itemView.textViewCard02
        }//end MyViewHolder function
    }//end MyViewHolder class
}//end MyAdapter class