【问题标题】:Can't load firebase details to recycler view ? Kotlin无法将 Firebase 详细信息加载到回收站视图?科特林
【发布时间】:2021-11-21 03:47:18
【问题描述】:

我需要从 Firebase 实时数据库获取详细信息到片段中的 RecyclerView。我参考了许多教程,最后对此进行了编码。我收到了这个错误:

这是我的片段代码。

class busFragment : Fragment() {

    private lateinit var dbref: DatabaseReference
    private lateinit var routeRecyclerView: RecyclerView
    private lateinit var routesArrayList: ArrayList<BusRoutes>
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_bus, container, false)
    }

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        routeRecyclerView = view.findViewById(R.id.bus_routes)
        routeRecyclerView.layoutManager = LinearLayoutManager(activity)
        routeRecyclerView.setHasFixedSize(true)

        routesArrayList = arrayListOf<BusRoutes>()
        getRouteDetails()

    }

    private fun getRouteDetails() {
        dbref = FirebaseDatabase.getInstance().getReference("BusRoutes")

        dbref.addValueEventListener(object : ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()){
                    for (routeSnapshot in snapshot.children){
                        val route = routeSnapshot.getValue(BusRoutes::class.java)
                        routesArrayList.add(route!!)
                    }
                    routeRecyclerView.adapter = Adapter(routesArrayList)
                }
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }


        })
    }

    companion object {

    }

}

这是我的适配器.kt

class Adapter(private val routeslist: ArrayList<BusRoutes>) : RecyclerView.Adapter<Adapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.items_busroutes,
            parent,false)
        return MyViewHolder(itemView as ViewGroup)

    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = routeslist[position]

        holder.route.text = currentItem.routeNo
        holder.start.text = currentItem.start
        holder.end.text = currentItem.end
    }

    override fun getItemCount(): Int {
        return routeslist.size
    }


    class MyViewHolder(itemView:ViewGroup) : RecyclerView.ViewHolder(itemView){
        val route : TextView = itemView.findViewById(R.id.routeNo)
        val start : TextView = itemView.findViewById(R.id.startPlace)
        val end : TextView = itemView.findViewById(R.id.endPlace)

    }

}

这是我的数据类。

这是我的 Firebase 详细信息。

这是第 52 行 val route = routeSnapshot.getValue(BusRoutes::class.java)

我多次尝试修复此问题,但仍然找不到。帮我。我还在学习 Kotlin。

更新

BusRoutes 类:

data class BusRoutes(val routeNo: String? = null, val start: String? = null, val end: String? = null)

【问题讨论】:

  • 不清楚你是如何在你的firebase中保存routeNo的,如果它是一个没有引号的Long数字,就像错误所说的那样,那么你需要确保它们被保存为@ 987654335@否则;更改您的数据类并使routeNo Long
  • 请显示你的BusRoutes类的内容和你的数据库的清晰图像。请回复@AlexMamo
  • @AlexMamo 更新
  • @Jagar 我认为这是错误,但为什么它说没有连接适配器

标签: android firebase kotlin firebase-realtime-database google-cloud-platform


【解决方案1】:

您收到以下错误:

无法将 java.lang.long 类型的值转换为字符串

因为您数据库中的routeNo 字段是数字类型,而您的类中是字符串类型,这是不正确的。两种类型都必须匹配,因为在 Kotlin 中无法将对象类型 Long 转换为 String,因此会出现错误。

最简单的解决方案是更改 BusRoutes 类的声明,如下所示:

data class BusRoutes(val routeNo: Long? = null, val start: String? = null, val end: String? = null)
//                                 ^^

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 2011-04-02
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多