我正在嘗試從 firebase 檢索資料并將它們寫入自定義回收器視圖。我撰寫了代碼,但我不明白為什么沒有正確地從資料庫中獲取資料。
這是主要活動:
private lateinit var myDatabase: FirebaseDatabase
private lateinit var myReference: DatabaseReference
private var nameOfTournamentOnDatabase: String = "Tournament"
private var listOfTournaments: ArrayList<TournamentData> = ArrayList()
private var adapter: DataListAdapter? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? {
myDatabase = FirebaseDatabase.getInstance()
myReference = myDatabase.getReference(nameOfTournamentOnDatabase)
return inflater.inflate(R.layout.fragment_tournament_list, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
var myList: RecyclerView = view.findViewById<RecyclerView>(R.id.myList)
adapter = DataListAdapter(listOfTournaments, view.context)
myList.layoutManager = LinearLayoutManager(view.context)
myList.adapter = adapter
getDataFromDatabase()
adapter!!.notifyDataSetChanged()
}
private fun getDataFromDatabase(){
myReference.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
for(ds in snapshot.children){
listOfTournaments.add(TournamentData(ds.child("nameOfTournament").value.toString(),
ds.child("nameOfCreator").value.toString(), ds.child("numberOfCompetitors").value.toString(),
ds.child("nameOfCompetitors").value.toString()))
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
這是自定義配接器類:
class DataListAdapter(private val dataTournamentList: ArrayList<TournamentData>, private val context: Context) : RecyclerView.Adapter<DataListAdapter.ViewHolder> (){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.card_layout, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindItem(dataTournamentList[position])
}
override fun getItemCount(): Int {
return dataTournamentList.size
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindItem(data: TournamentData){
var tournamentName : TextView = itemView.findViewById(R.id.name_of_tuornament) as TextView
var nameOfCreator : TextView = itemView.findViewById(R.id.name_of_creator) as TextView
var numberOfCompetitors : TextView = itemView.findViewById(R.id.number_of_competitor) as TextView
tournamentName.text = data.nameOfTournament
nameOfCreator.text = data.nameOfCreator
numberOfCompetitors.text = data.numberOfCompetitors
}
}
}
我不明白為什么資料沒有到達。代碼撰寫正確,沒有錯誤,資料庫設定正確。
uj5u.com熱心網友回復:
adapter.notifyDataSetChanged()在對配接器顯示的資料串列進行任何更改后,您需要呼叫(因此在您的onDataChange.
作為一般規則,我還建議不要onCanceled留空,因為您忽略了可能的錯誤。至少應該是:
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/432437.html
標籤:安卓 科特林 firebase-实时数据库
上一篇:Kotlin資料類屬性:多種型別
