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 badge1 Answer
Reset to default 1Your 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:
- Remove the lateinit attribute from the adapter member variable and before accessing it, see if it has been initialized
- 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.