【问题标题】:I am trying to show recyclerView in Fragment but I am getting an error我正在尝试在 Fragment 中显示 recyclerView,但出现错误
【发布时间】:2022-01-21 22:49:12
【问题描述】:
class FeedRecyclerAdapter (private val postList : ArrayList<Post>) : RecyclerView.Adapter<FeedRecyclerAdapter.PostHolder>() {

class PostHolder(val binding: FragmentDataBinding) : RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostHolder {
        val binding = FragmentDataBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return PostHolder(binding)
}

override fun onBindViewHolder(holder: PostHolder, position: Int) {

    holder.binding.verimText.text = postList.get(position).lsi

}

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

这是为 recyclerView 编写的代码。

private lateinit var firestore: FirebaseFirestore
private lateinit var auth: FirebaseAuth
private var _binding: FragmentDataBinding? = null
private val binding get() = _binding!!

private lateinit var postArrayList : ArrayList<Post>
private lateinit var feedAdapter : FeedRecyclerAdapter



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    auth = Firebase.auth
    firestore = Firebase.firestore

    postArrayList = ArrayList<Post>()
    feedAdapter = FeedRecyclerAdapter(postArrayList)

    getData()

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    _binding = FragmentDataBinding.inflate(inflater, container, false)
    val view = binding.root


    return view

}


   private fun getData(){
        firestore.collection("Posts").addSnapshotListener { value, error ->

        if (error!=null){
            Toast.makeText(requireContext(),error.localizedMessage,Toast.LENGTH_SHORT).show()
        }else{
            if (value !=null){
                if (!value.isEmpty){
                    val documents = value.documents
                    for (document in documents){
                        val araziBoyutu = document.get("Arazi Boyutu") as String
                        val araziEgimi = document.get("Arazi Eğimi") as String
                        val panelBoyutu = document.get("Panel Boyutu") as String
                        val panelSayisi = document.get("Panel Sayisi") as String
                        val sehir = document.get("Şehir") as String



                        val post = Post(panelSayisi,panelBoyutu,araziEgimi,araziBoyutu,sehir)
                        postArrayList.add(post)
                        recyclerView.adapter = FeedRecyclerAdapter(postArrayList)


                    }

                    feedAdapter.notifyDataSetChanged()

                }
            }
        }
    }
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    binding.recyclerView.adapter = feedAdapter
    recyclerView.layoutManager = LinearLayoutManager(activity)

这里的代码是我定义 RecyclerView 并保存信息的部分。

我可以拉取数据,我可以在firebase上看到我正在尝试打印的 verimText TextView 中的这些数据。

【问题讨论】:

  • 您得到的确切错误是什么?
  • 尝试在空对象引用上调用虚拟方法 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)'
  • 您在代码中的哪个位置设置了适配器?请分享该代码。
  • 我解决了这个问题。但现在还有另一个问题。我能够显示我保存在 verimText 中的数据。我用 println 命令调试,我可以看到我在 logcat 上输入的数据。但是有一个问题。 Firebase 总是在 verimText 上写入我输入的第一个值,而不是在 firestore 中注册的最后一个值。
  • 我更新了第 2 部分的代码。现在我的位置应用程序中的所有代码都是这样的。

标签: android firebase kotlin fragment


【解决方案1】:

移动这条线

recyclerView.adapter = FeedRecyclerAdapter(postArrayList)

val post = Post(panelSayisi,panelBoyutu,araziEgimi,araziBoyutu,sehir)
postArrayList.add(post)
recyclerView.adapter = FeedRecyclerAdapter(postArrayList)//move to here

【讨论】:

    【解决方案2】:

    Recyclerview 应该在onViewCreated 方法中声明

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                super.onViewCreated(view, savedInstanceState)
           val recyclerView = view.findViewById(R.id.recyclerView) as RecyclerView
           recyclerView.layoutManager = LinearLayoutManager(activity)
           recyclerView.adapter = FeedRecyclerAdapter(postArrayList)
        }
    

    【讨论】:

    • 我的问题解决了。现在我可以显示我输入的数据了。但现在它并没有改变我输入的不同数据。它在 firebase 上保存新数据,但在 textView 中显示旧信息。
    • 插入数据后再次尝试调用getData()方法..这样它会再次获取最新数据
    • 我需要学习一些东西。比如我的项目的包代码是xxx.yyy.com,但是我尝试把这个数据从fragment中拉出来打印到另一个fragment,那些fragment的包名是xxx.yyy.com.fragment。我是否需要将碎片化的包名称保存到 Firebase?
    【解决方案3】:

    添加帖子后尝试拨打notifyDataSetChanged()notifyItemRangeInserted()

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 2022-11-13
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多