#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