【问题标题】:kotlin.UninitializedPropertyAccessException: lateinit property adapterPosts has not been initializedkotlin.UninitializedPropertyAccessException:lateinit 属性 adapterPosts 尚未初始化
【发布时间】:2021-04-02 16:28:24
【问题描述】:
Process: com.example.socialapplication, PID: 31405
    kotlin.UninitializedPropertyAccessException: lateinit property adapterPosts has not been initialized
        at com.example.socialapplication.Fragment.HomeFragment.access$getAdapterPosts$p(HomeFragment.kt:24)
        at com.example.socialapplication.Fragment.HomeFragment$loadPosts$postData$1.onDataChange(HomeFragment.kt:104)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.0:55)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7807)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)

源代码

class HomeFragment : BaseFragment() {

    .....
    private lateinit var adapterPosts : AdapterGrid

    .....

    adapterPosts = AdapterGrid(activity, postList)
    adapterPosts.notifyDataSetChanged()

    }

    recyclerView.adapter = adapterPosts // getting error

所需代码

    @Suppress("ControlFlowWithEmptyBody", "DEPRECATION")
class HomeFragment : BaseFragment() {

    private lateinit var firebaseAuth : FirebaseAuth
    private lateinit var ref : DatabaseReference
    private lateinit var mDatabase: FirebaseDatabase

    private lateinit var shimmerPost : ShimmerFrameLayout
    private lateinit var recyclerView : RecyclerView
    private lateinit var postList : ArrayList<ModelPost>
    private lateinit var adapterPosts : AdapterGrid


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_home, container, false)

        findView(view)
        initView(view)

        return view
    }

    override fun findView(view: View) {

        recyclerView = view.findViewById(R.id.postsRecyclerview)
        shimmerPost = view.findViewById(R.id.shimmer_view)

    }

    override fun initView(view: View) {

        firebaseAuth = FirebaseAuth.getInstance()
        mDatabase = FirebaseDatabase.getInstance()

        val layoutManager = GridLayoutManager(activity, 2)

        // tampilkan posting terbaru terlebih dahulu, untuk memuat ini dari yang terakhir
//        layoutManager.stackFromEnd = true
//        layoutManager.reverseLayout = true
        //set layout untuk recyclerView
        recyclerView.setHasFixedSize(true)
        recyclerView.layoutManager = layoutManager

        postList = arrayListOf()

        loadPosts()

    }

    override fun initListeners(view: View) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    private fun loadPosts() {

        val ref = mDatabase.getReference("Posts")

        val postData : ValueEventListener? = object : ValueEventListener{

            override fun onDataChange(p0: DataSnapshot) {

                postList.clear()
                for (ds : DataSnapshot in p0.children){

                    val modelPost = ds.getValue(ModelPost::class.java)

                    if (modelPost != null) {

                        postList.add(modelPost)
                    }
                    shimmerPost.stopShimmer()
                    shimmerPost.visibility = View.GONE
                    recyclerView.visibility = View.VISIBLE

                    //adapter
                    adapterPosts = AdapterGrid(activity, postList)
                    adapterPosts.notifyDataSetChanged()

                }
                //set adapter untuk recyclerView
                recyclerView.adapter = adapterPosts
            }

            override fun onCancelled(p0: DatabaseError) {
                Toast.makeText(activity, p0.message, Toast.LENGTH_SHORT).show()
            }
        }
        if (postData != null) {
            ref.addValueEventListener(postData)
        }else{
        }

    }

【问题讨论】:

  • ..... 是什么?您可能必须添加整个代码,因为在初始化之前以某种方式调用了 recyclerView.adapter = adapterPosts
  • 请编辑问题以显示重现问题的complete minimal code。您现在所拥有的不足以说明究竟出了什么问题以及如何纠正它。
  • 请检查上面我分享了所需的代码,如果您需要查看adater类的代码,请告诉我
  • @Android 我找不到您在上面发布的代码中使用adapterPosts 的位置。发布 homefragment 代码
  • 错误提示您在使用之前没有初始化adapterPosts。这种访问发生在HomeFragment.kt:24(第 24 行)

标签: android firebase kotlin android-recyclerview


【解决方案1】:

您的代码几乎没有问题。

  1. 您不要在循环中创建adapter

  2. 你不应该在创建适配器后调用notifyDataSetChanged,它没有用,只有在数据集实际发生变化时才应该调用它。

  3. 您的代码崩溃的主要原因是for-loop 永远不会被执行,因为我猜DatasnapShot 是空的。 纠正以上错误。

    private fun loadPosts() {
     val ref = mDatabase.getReference("Posts")
     val postData: ValueEventListener? = object : ValueEventListener {
         override fun onDataChange(p0: DataSnapshot) {
             if (isAdded()) {
                 postList.clear()
                 for (ds: DataSnapshot in p0.children) {
                     val modelPost = ds.getValue(ModelPost::class.java)
                     if (modelPost != null) {
                         postList.add(modelPost)
                     }
                 }
                 shimmerPost.stopShimmer()
                 shimmerPost.visibility = View.GONE
                 recyclerView.visibility = View.VISIBLE
                 // also check if postList is blank to show some error view for no data found
                 adapterPosts = AdapterGrid(activity, postList)
                 recyclerView.adapter = adapterPosts
             }
         }
         override fun onCancelled(p0: DatabaseError) {
             if (isAdded())
                 Toast.makeText(activity, p0.message, Toast.LENGTH_SHORT).show()
         }
     }
     if (postData != null) {
         ref.addValueEventListener(postData)
     } else {
     }
     }
    

【讨论】:

    【解决方案2】:

    这是因为当你调用 loadPosts 函数时,它会首先启动recyclerView.adapter = adapterPosts 这个命令。所以只需更改初始化位置即可。

    private fun loadPosts() {
        adapterPosts = AdapterGrid(activity, ArrayList());
        val ref = mDatabase.getReference("Posts")
    
        val postData : ValueEventListener? = object : ValueEventListener{
    
            override fun onDataChange(p0: DataSnapshot) {
    
                postList.clear()
                for (ds : DataSnapshot in p0.children){
    
                    val modelPost = ds.getValue(ModelPost::class.java)
    
                    if (modelPost != null) {
    
                        postList.add(modelPost)
                    }
                    shimmerPost.stopShimmer()
                    shimmerPost.visibility = View.GONE
                    recyclerView.visibility = View.VISIBLE
    
                    //adapter
                    adapterPosts.arrayname.addAll(postList);
                    adapterPosts.notifyDataSetChanged()
    
                }
                //set adapter untuk recyclerView
                recyclerView.adapter = adapterPosts
            }
    
            override fun onCancelled(p0: DatabaseError) {
                Toast.makeText(activity, p0.message, Toast.LENGTH_SHORT).show()
            }
        }
        if (postData != null) {
            ref.addValueEventListener(postData)
        }else{
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2020-04-18
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2020-11-01
      • 2020-09-06
      相关资源
      最近更新 更多