最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

kotlin lateinit - How can I add a button end of the recycler view on xmlandroid - Stack Overflow

programmeradmin10浏览0评论

I want to print the users that I have stored in the room db in my project. I use the recycler view for this. But I want to put an "add new user" button on the same page to add users. But no matter what I do, my application crashes.

this is my list xml file that I print all the users

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
    xmlns:android=";
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <androidx.recyclerview.widget.RecyclerView

            xmlns:android=";
            xmlns:app=";
            xmlns:tools=";
            android:id="@+id/list"
            android:name="com.talhakasikci.mylittlelibrary.view.MembersListFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            app:layoutManager="LinearLayoutManager"
            tools:context=".view.MembersListFragment"
            tools:listitem="@layout/fragment_members_list" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add a new member"
            />


    </LinearLayout>



</androidx.core.widget.NestedScrollView>

and it must look like this enter image description here

but, it crashes when I open this page.

The Errors:

 2025-02-05 03:44:31.152 24645-24645 AndroidRuntime          com.talhakasikci.mylittlelibrary     E  FATAL EXCEPTION: main
                                                                                                    Process: com.talhakasikci.mylittlelibrary, PID: 24645
                                                                                                    kotlin.UninitializedPropertyAccessException: lateinit property adapter has not been initialized
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment.onViewCreated$lambda$0(MembersListFragment.kt:52)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment.$r8$lambda$sTuiqA9XHSIlUYSztqmtb3yO0Bs(Unknown Source:0)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment$sam$androidx_lifecycle_Observer$0.onChanged(Unknown Source:2)
                                                                                                        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
                                                                                                        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
                                                                                                        at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
                                                                                                        at androidx.lifecycle.LiveData$1.run(LiveData.java:93)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205)
                                                                                                        at android.os.Looper.loop(Looper.java:294)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8177)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
2025-02-05 03:44:31.225 32339-32452 OneSearchS...stProvider com...le.android.apps.nexuslauncher  E  Failed to fetch suggestions from AppSearch, fallback to AGA
                                                                                                    java.util.concurrent.CompletionException: java.util.NoSuchElementException: No value present
                                                                                                        at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:308)
                                                                                                        at java.util.concurrent.CompletableFuturepleteThrowable(CompletableFuture.java:323)
                                                                                                        at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:684)
                                                                                                        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:486)
                                                                                                        at java.util.concurrent.CompletableFuturepleteExceptionally(CompletableFuture.java:2138)
                                                                                                        at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:59)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205)
                                                                                                        at android.os.Looper.loop(Looper.java:294)
                                                                                                        at android.os.HandlerThread.run(HandlerThread.java:67)
                                                                                                    Caused by: java.util.NoSuchElementException: No value present
                                                                                                        at java.util.Optional.get(Optional.java:144)
                                                                                                        at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:16)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129) 
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1) 
                                                                                                        at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13) 
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205) 
                                                                                                        at android.os.Looper.loop(Looper.java:294) 
                                                                                                        at android.os.HandlerThread.run(HandlerThread.java:67) 

also my fragment code:

package com.talhakasikci.mylittlelibrary.view

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.talhakasikci.mylittlelibrary.R
import com.talhakasikci.mylittlelibrary.adapter.MyMembersRecyclerViewAdapter
import com.talhakasikci.mylittlelibrary.databinding.FragmentMembersListBinding
import com.talhakasikci.mylittlelibrary.view.placeholder.PlaceholderContent
import com.talhakasikci.mylittlelibrary.viewModel.MembersViewModel

/**
 * A fragment representing a list of Items.
 */
class MembersListFragment : Fragment() {

    private lateinit var viewModel: MembersViewModel
    private lateinit var adapter: MyMembersRecyclerViewAdapter
    private lateinit var binding:FragmentMembersListBinding



    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentMembersListBinding.inflate(inflater,container,false)
        val view = inflater.inflate(R.layout.fragment_members_list_list, container, false)

        if (view is RecyclerView) {
            view.layoutManager = LinearLayoutManager(context)
            adapter = MyMembersRecyclerViewAdapter(emptyList())
            view.adapter = adapter
        }

        return view
    }

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

        viewModel = ViewModelProvider(this).get(MembersViewModel::class.java)

        viewModel.allMembers.observe(viewLifecycleOwner) { members ->
            adapter.updateData(members)
        }
        binding.DeleteIcon.setOnClickListener {

        }




    }
}

place holder:

package com.talhakasikci.mylittlelibrary.view.placeholder

import java.util.ArrayList
import java.util.HashMap

/**
 * Helper class for providing sample content for user interfaces created by
 * Android template wizards.
 */
object PlaceholderContent {

    /**
     * An array of sample (placeholder) items.
     */
    val ITEMS: MutableList<PlaceholderItem> = ArrayList()

    /**
     * A map of sample (placeholder) items, by ID.
     */
    val ITEM_MAP: MutableMap<String, PlaceholderItem> = HashMap()

    private const val COUNT = 25

    init {
        // Add some sample items.
        for (i in 1..COUNT) {
            addItem(createPlaceholderItem(i))
        }
    }

    private fun addItem(item: PlaceholderItem) {
        ITEMS.add(item)
        ITEM_MAP[item.id] = item
    }

    private fun createPlaceholderItem(position: Int): PlaceholderItem {
        return PlaceholderItem(
            id = position.toString(),
            nameView = "Name $position",
            surnameView = "Surname $position",
            memberIDView = position.toLong()
        )
    }

    /**
     * A placeholder item representing a piece of content.
     */
    data class PlaceholderItem(
        val id: String,
        val nameView: String,
        val surnameView: String,
        val memberIDView: Long
    ) {
        override fun toString(): String {
            return "ID: $id\nName: $nameView\nSurname: $surnameView\nMember ID: $memberIDView"
        }
    }
}

adapter:

package com.talhakasikci.mylittlelibrary.adapter

import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView

import com.talhakasikci.mylittlelibrary.view.placeholder.PlaceholderContent.PlaceholderItem
import com.talhakasikci.mylittlelibrary.databinding.FragmentMembersListBinding
import com.talhakasikci.mylittlelibrary.model.Members

/**
 * [RecyclerView.Adapter] that can display a [PlaceholderItem].
 * TODO: Replace the implementation with code for your data type.
 */
class MyMembersRecyclerViewAdapter(
    private var members: List<Members>
) : RecyclerView.Adapter<MyMembersRecyclerViewAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            FragmentMembersListBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val member = members[position]
        holder.idView.text = member.id.toString()
        holder.NameView.text = member.First_Name
        holder.SurnameView.text = member.Last_Name
        holder.MemberID.text = member.MemberID.toString()
    }

    override fun getItemCount(): Int = members.size

    fun updateData(newMembers: List<Members>) {
        members = newMembers
        notifyDataSetChanged()
    }

    inner class ViewHolder(binding: FragmentMembersListBinding) :
        RecyclerView.ViewHolder(binding.root) {
        val idView: TextView = binding.itemNumber
        val NameView: TextView = binding.Name
        val SurnameView: TextView = binding.Surname
        val MemberID: TextView = binding.MemberID
    }
}

viewModel:

package com.talhakasikci.mylittlelibrary.viewModel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import com.talhakasikci.mylittlelibrary.model.Members
import com.talhakasikci.mylittlelibrary.roomdb.BooksDB
import com.talhakasikci.mylittlelibrary.roomdb.MembersDao
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class MembersViewModel(application: Application) : AndroidViewModel(application) {

    private val membersDao: MembersDao = BooksDB.getDatabase(application).MembersDao()

    val allMembers: LiveData<List<Members>> = membersDao.getAll()

    fun insert(member: Members) {
        viewModelScope.launch(Dispatchers.IO) {
            membersDao.MemberInsert(member)
        }
    }

    fun delete(member: Members) {
        viewModelScope.launch(Dispatchers.IO) {
            membersDao.MemberDelete(member)
        }
    }
}

NOTE: My db has not problem. I can print the users when I just use recycler view.

I want to print the users that I have stored in the room db in my project. I use the recycler view for this. But I want to put an "add new user" button on the same page to add users. But no matter what I do, my application crashes.

this is my list xml file that I print all the users

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <androidx.recyclerview.widget.RecyclerView

            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/list"
            android:name="com.talhakasikci.mylittlelibrary.view.MembersListFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            app:layoutManager="LinearLayoutManager"
            tools:context=".view.MembersListFragment"
            tools:listitem="@layout/fragment_members_list" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add a new member"
            />


    </LinearLayout>



</androidx.core.widget.NestedScrollView>

and it must look like this enter image description here

but, it crashes when I open this page.

The Errors:

 2025-02-05 03:44:31.152 24645-24645 AndroidRuntime          com.talhakasikci.mylittlelibrary     E  FATAL EXCEPTION: main
                                                                                                    Process: com.talhakasikci.mylittlelibrary, PID: 24645
                                                                                                    kotlin.UninitializedPropertyAccessException: lateinit property adapter has not been initialized
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment.onViewCreated$lambda$0(MembersListFragment.kt:52)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment.$r8$lambda$sTuiqA9XHSIlUYSztqmtb3yO0Bs(Unknown Source:0)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.talhakasikci.mylittlelibrary.view.MembersListFragment$sam$androidx_lifecycle_Observer$0.onChanged(Unknown Source:2)
                                                                                                        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
                                                                                                        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
                                                                                                        at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
                                                                                                        at androidx.lifecycle.LiveData$1.run(LiveData.java:93)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205)
                                                                                                        at android.os.Looper.loop(Looper.java:294)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8177)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
2025-02-05 03:44:31.225 32339-32452 OneSearchS...stProvider com...le.android.apps.nexuslauncher  E  Failed to fetch suggestions from AppSearch, fallback to AGA
                                                                                                    java.util.concurrent.CompletionException: java.util.NoSuchElementException: No value present
                                                                                                        at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:308)
                                                                                                        at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:323)
                                                                                                        at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:684)
                                                                                                        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:486)
                                                                                                        at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2138)
                                                                                                        at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:59)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205)
                                                                                                        at android.os.Looper.loop(Looper.java:294)
                                                                                                        at android.os.HandlerThread.run(HandlerThread.java:67)
                                                                                                    Caused by: java.util.NoSuchElementException: No value present
                                                                                                        at java.util.Optional.get(Optional.java:144)
                                                                                                        at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:16)
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129) 
                                                                                                        at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1) 
                                                                                                        at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13) 
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:205) 
                                                                                                        at android.os.Looper.loop(Looper.java:294) 
                                                                                                        at android.os.HandlerThread.run(HandlerThread.java:67) 

also my fragment code:

package com.talhakasikci.mylittlelibrary.view

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.talhakasikci.mylittlelibrary.R
import com.talhakasikci.mylittlelibrary.adapter.MyMembersRecyclerViewAdapter
import com.talhakasikci.mylittlelibrary.databinding.FragmentMembersListBinding
import com.talhakasikci.mylittlelibrary.view.placeholder.PlaceholderContent
import com.talhakasikci.mylittlelibrary.viewModel.MembersViewModel

/**
 * A fragment representing a list of Items.
 */
class MembersListFragment : Fragment() {

    private lateinit var viewModel: MembersViewModel
    private lateinit var adapter: MyMembersRecyclerViewAdapter
    private lateinit var binding:FragmentMembersListBinding



    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentMembersListBinding.inflate(inflater,container,false)
        val view = inflater.inflate(R.layout.fragment_members_list_list, container, false)

        if (view is RecyclerView) {
            view.layoutManager = LinearLayoutManager(context)
            adapter = MyMembersRecyclerViewAdapter(emptyList())
            view.adapter = adapter
        }

        return view
    }

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

        viewModel = ViewModelProvider(this).get(MembersViewModel::class.java)

        viewModel.allMembers.observe(viewLifecycleOwner) { members ->
            adapter.updateData(members)
        }
        binding.DeleteIcon.setOnClickListener {

        }




    }
}

place holder:

package com.talhakasikci.mylittlelibrary.view.placeholder

import java.util.ArrayList
import java.util.HashMap

/**
 * Helper class for providing sample content for user interfaces created by
 * Android template wizards.
 */
object PlaceholderContent {

    /**
     * An array of sample (placeholder) items.
     */
    val ITEMS: MutableList<PlaceholderItem> = ArrayList()

    /**
     * A map of sample (placeholder) items, by ID.
     */
    val ITEM_MAP: MutableMap<String, PlaceholderItem> = HashMap()

    private const val COUNT = 25

    init {
        // Add some sample items.
        for (i in 1..COUNT) {
            addItem(createPlaceholderItem(i))
        }
    }

    private fun addItem(item: PlaceholderItem) {
        ITEMS.add(item)
        ITEM_MAP[item.id] = item
    }

    private fun createPlaceholderItem(position: Int): PlaceholderItem {
        return PlaceholderItem(
            id = position.toString(),
            nameView = "Name $position",
            surnameView = "Surname $position",
            memberIDView = position.toLong()
        )
    }

    /**
     * A placeholder item representing a piece of content.
     */
    data class PlaceholderItem(
        val id: String,
        val nameView: String,
        val surnameView: String,
        val memberIDView: Long
    ) {
        override fun toString(): String {
            return "ID: $id\nName: $nameView\nSurname: $surnameView\nMember ID: $memberIDView"
        }
    }
}

adapter:

package com.talhakasikci.mylittlelibrary.adapter

import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView

import com.talhakasikci.mylittlelibrary.view.placeholder.PlaceholderContent.PlaceholderItem
import com.talhakasikci.mylittlelibrary.databinding.FragmentMembersListBinding
import com.talhakasikci.mylittlelibrary.model.Members

/**
 * [RecyclerView.Adapter] that can display a [PlaceholderItem].
 * TODO: Replace the implementation with code for your data type.
 */
class MyMembersRecyclerViewAdapter(
    private var members: List<Members>
) : RecyclerView.Adapter<MyMembersRecyclerViewAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            FragmentMembersListBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val member = members[position]
        holder.idView.text = member.id.toString()
        holder.NameView.text = member.First_Name
        holder.SurnameView.text = member.Last_Name
        holder.MemberID.text = member.MemberID.toString()
    }

    override fun getItemCount(): Int = members.size

    fun updateData(newMembers: List<Members>) {
        members = newMembers
        notifyDataSetChanged()
    }

    inner class ViewHolder(binding: FragmentMembersListBinding) :
        RecyclerView.ViewHolder(binding.root) {
        val idView: TextView = binding.itemNumber
        val NameView: TextView = binding.Name
        val SurnameView: TextView = binding.Surname
        val MemberID: TextView = binding.MemberID
    }
}

viewModel:

package com.talhakasikci.mylittlelibrary.viewModel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import com.talhakasikci.mylittlelibrary.model.Members
import com.talhakasikci.mylittlelibrary.roomdb.BooksDB
import com.talhakasikci.mylittlelibrary.roomdb.MembersDao
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class MembersViewModel(application: Application) : AndroidViewModel(application) {

    private val membersDao: MembersDao = BooksDB.getDatabase(application).MembersDao()

    val allMembers: LiveData<List<Members>> = membersDao.getAll()

    fun insert(member: Members) {
        viewModelScope.launch(Dispatchers.IO) {
            membersDao.MemberInsert(member)
        }
    }

    fun delete(member: Members) {
        viewModelScope.launch(Dispatchers.IO) {
            membersDao.MemberDelete(member)
        }
    }
}

NOTE: My db has not problem. I can print the users when I just use recycler view.

Share Improve this question edited Feb 5 at 6:19 tomerpacific 6,46018 gold badges41 silver badges60 bronze badges asked Feb 5 at 6:03 talha kaşıkcıtalha kaşıkcı 11 silver badge
Add a comment  | 

1 Answer 1

Reset to default 1

Your application crashes due to the first line of the stacktrace:

lateinit property adapter has not been initialized

If you look at the class MembersListFragment, you can see that you declared this member variable as lateinit:

class MembersListFragment : Fragment() {

    private lateinit var viewModel: MembersViewModel
    private lateinit var adapter: MyMembersRecyclerViewAdapter // <--- HERE
    private lateinit var binding:FragmentMembersListBinding

and you are initializing it only if the view is a RecyclerView:

   if (view is RecyclerView) {
            view.layoutManager = LinearLayoutManager(context)
            adapter = MyMembersRecyclerViewAdapter(emptyList())
            view.adapter = adapter
        }

and then in your onViewCreated method, you have this:

viewModel.allMembers.observe(viewLifecycleOwner) { members ->
            adapter.updateData(members)
        }

Which in the case where the view isn't a RecyclerView, causes the exception.

You have two choices here:

  1. Remove the lateinit attribute from the adapter member variable and before accessing it, see if it has been initialized
  2. Always initialize your adapter

Since I am not aware of the specifics of what you are trying to do, some things are a bit unclear in your logic, but my answer should resolve the crash you are experiencing.

发布评论

评论列表(0)

  1. 暂无评论