При выборе начального пунка меню в навигации информация дублируется
Начал разрабатывать приложение с BottomNavigationView, сделал 3 фрагмента, выбрал начальный элемент меню. Но когда возвращаешься на данный фрагмент информация там дублируется. Просьба помочь понять почему это вообще происходит и как это исправить.
Хостовый активити:
import androidx.activity.viewModels
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.setupWithNavController
import com.example.firstapp.Flags
import com.example.firstapp.R
import com.example.firstapp.databinding.ActivityTestNavBinding
class TestNavActivity : AppCompatActivity() {
lateinit var binding:ActivityTestNavBinding
private val flag: Flags by viewModels()
private lateinit var navController:NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityTestNavBinding.inflate(layoutInflater)
setContentView(binding.root)
Log.d("MyLog","Активити Нав создан")
navController = findNavController(R.id.fragmentContainerView)
binding.bottomNavigationView.setupWithNavController(navController)
Log.d("MyLog","Контроллер определен")
flag.alreadyExistModule.value = true
}
}
Код фрагмента:
package com.example.firstapp.Fragments
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.firstapp.Adapter.ModulesAdapter
import com.example.firstapp.Flags
import com.example.firstapp.ModulesData
import com.example.firstapp.R
import com.example.firstapp.databinding.FragmentModuleBinding
class ModuleFrag : Fragment(), ModulesAdapter.Listener {
lateinit var binding: FragmentModuleBinding
private val adapter = ModulesAdapter(this)
private val flags: Flags by activityViewModels()
private val ImIdList = listOf(
R.drawable.plug1,
R.drawable.plug2,
R.drawable.plug3,
R.drawable.plug4,
R.drawable.plug5,
)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentModuleBinding.inflate(inflater)
Log.d("MyLog","Запуск вью фрагмента ModuleFrag ${flags.alreadyExistModule.value}")
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Log.d("MyLog","Фрагмент вью создан ModuleFrag ${flags.alreadyExistModule.value}")
init()
}
companion object {
@JvmStatic
fun newInstance() = ModuleFrag()
}
private fun init(){
val modTitles = resources.getStringArray(R.array.ModTitle)
val modDesc = resources.getStringArray(R.array.ModDesc)
binding.apply {
rcycModules.layoutManager = LinearLayoutManager(context)
rcycModules.adapter = adapter
for (index in 0..modTitles.size - 1) {
val module = ModulesData(
ImIdList[index],
modTitles[index],
modDesc[index],
index
)
adapter.addModule(module)
}
}
}
override fun onClick(module: ModulesData) {
}
}
Код адаптера для RecyclerView:
package com.example.firstapp.Adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.firstapp.ModulesData
import com.example.firstapp.R
import com.example.firstapp.databinding.ModuleItemBinding
class ModulesAdapter(val listener: Listener): RecyclerView.Adapter<ModulesAdapter.ModulesHolder>() {
val moduleList = ArrayList<ModulesData>()
class ModulesHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = ModuleItemBinding.bind(item)
fun bind(module: ModulesData, listener: Listener) = with(binding){
imModule.setImageResource(module.ImgId)
txtMainTitle.text = module.Title
txtDesc.text = module.Subtitle
btMain.setOnClickListener{
listener.onClick(module)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ModulesHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.module_item, parent, false)
return ModulesHolder(view)
}
override fun getItemCount(): Int {
return moduleList.size
}
override fun onBindViewHolder(holder: ModulesHolder, position: Int) {
holder.bind(moduleList[position], listener)
}
fun addModule(module: ModulesData){
moduleList.add(module)
notifyDataSetChanged()
}
interface Listener{
fun onClick(module: ModulesData)
}
}
Я пробовал поставить флаг, чтобы при заходе в init() флаг принимал значение true и затем, чтобы в данный метод больше не заходить, но в таком случае RecyclerView вообще ничего не рисует.
Разметка фрагмента:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_background"
tools:context=".Fragments.ModuleFrag">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcycModules"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>