kotlin 在片段中的 RecyclerView 中显示来自 Firebase 数据库的数据

Posted

技术标签:

【中文标题】kotlin 在片段中的 RecyclerView 中显示来自 Firebase 数据库的数据【英文标题】:kotlin displaying data from Firebase database in RecyclerView in fragment 【发布时间】:2020-02-01 18:52:44 【问题描述】:

这是我第一次构建应用程序。我想在 recyclerview 的 firebase realtimedatabase 中显示我的数据。但是 'E/RecyclerView: 没有附加适配器;跳过布局”在运行图表上。

我会按顺序给你看我的代码。

首先,这是我在 kotlin 中的 Data 类

data class BalInputDTO(
var Id : String? = null,
var Itype: String? = null,
var Icategory: String? = null,
var ldate : String? = null,
var balance: String? = null,
var commnet: String? = null)

然后这是我的adapter.kt

class BalAdapter(val context: Context, val BalList: ArrayList<BalInputDTO>) :
RecyclerView.Adapter<BalAdapter.Holder>() 

override fun onBindViewHolder(holder: Holder, position: Int) 
    holder?.bind(BalList[position], context)



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder 
    val view = LayoutInflater.from(context).inflate(R.layout.household_detail, parent, false)
    return Holder(view)


override fun getItemCount(): Int 
    return BalList.size



inner class Holder(view: View?) : RecyclerView.ViewHolder(view!!) 
    val recordCategory = view?.findViewById<TextView>(R.id.record_category)
    val recordNote = view?.findViewById<TextView>(R.id.record_note)
    val recordAmount = view?.findViewById<TextView>(R.id.record_amount)
    val recordDate = view?.findViewById<TextView>(R.id.record_date)
    val recordDeleteImageView = view?.findViewById<ImageButton>(R.id.record_delete_image_button)

    fun bind(bal: BalInputDTO, context: Context) 
        recordCategory?.text = bal.Icategory
        recordNote?.text = bal.commnet
        recordAmount?.text = bal.balance
        recordDate?.text = bal.ldate
        //  recordDeleteImageView.imageb
    


和最后一个代码。这是我的 Fragment.kt(仅 onCreatView 部分)

var fragmentView : View? = null
var firedatabase : FirebaseDatabase? = null
var BalList : ArrayList<BalInputDTO> ? = null
var ref : DatabaseReference? = null

var mRecyclerView : RecyclerView? =null

override fun onCreateView(

    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?

): View? 
     fragmentView= LayoutInflater.from(activity).inflate(R.layout.fragment_household, container, false)

     firedatabase = FirebaseDatabase.getInstance()


     mRecyclerView = fragmentView?.findViewById(R.id.household_recyclerview)
     mRecyclerView?.setHasFixedSize(true)
     mRecyclerView?.layoutManager = LinearLayoutManager(context)


    BalList = arrayListOf<BalInputDTO>()
    ref = FirebaseDatabase.getInstance().getReference("BalInput")


    ref?.addValueEventListener(object : ValueEventListener 
        override fun onCancelled(p0: DatabaseError) 
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        

        override fun onDataChange(p0: DataSnapshot) 


            if(p0!!.exists())

                for (h in p0.children)
                    val bal = h.getValue(BalInputDTO::class.java)
                    BalList?.add(bal!!)
                

                val adapter = BalAdapter(context!!,BalList = ArrayList<BalInputDTO>())
                mRecyclerView?.setAdapter(adapter)

            

        
    )

    return  fragmentView

这是我的数据库enter image description here

如果我错过了什么或做错了什么,请告诉我。

【问题讨论】:

【参考方案1】:

您似乎将错误的列表传递给您的适配器。试试这个

val adapter = BalAdapter(context!!,BalList)

而不是

val adapter = BalAdapter(context!!,BalList = ArrayList<BalInputDTO>())

【讨论】:

【参考方案2】:

我想说这里真正的问题是这一行

 val adapter = BalAdapter(context!!,BalList = ArrayList<BalInputDTO>())

尝试将其更改为:

 val adapter = BalAdapter(context!!,BalList)

因为这是您从 FB 添加所有元素的地方。

【讨论】:

以上是关于kotlin 在片段中的 RecyclerView 中显示来自 Firebase 数据库的数据的主要内容,如果未能解决你的问题,请参考以下文章

片段内的 RecyclerView 的 Kotlin OnItemClickListener

kotlin:如何在两个片段之间传递数据

Fragments RecyclerView Databinding Kotlin - 未解析的引用变量名称

Kotlin Android Fragment recyclerView 和上下文问题

在recyclerview kotlin中插入firebase快照

Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)