- У меня есть группа ChipGroup, которая динамически заполняет чипы, представляющие разные категории.
- Категории извлекаются из База данных номеров и наблюдение за изменениями.
- У меня есть две вкладки: одна для операций по доходам и одна для операций по расходам.
- На каждой вкладке должны отображаться определенные категории. к ее типу (доход или расход).
- При добавлении новой категории ChipGroup должна обновиться, чтобы отображать новую категорию вместе с существующими. Однако после добавления новой категории ChipGroup иногда отображает категории не на той вкладке. Например, добавление категории на вкладку «Расходы» может привести к тому, что ChipGroup будет отображать категории из вкладки «Доход» вместо обновленного списка с новой категорией.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tabLayout = view.findViewById(R.id.transactionTabLayout)
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
currentTab = tab?.text.toString().lowercase()
categoryVM.getCategoriesByType(currentTab).observe(viewLifecycleOwner) { categories ->
populateChips(categories)
}
}
override fun onTabReselected(tab: TabLayout.Tab?) {
// Handle tab reselect
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
// Handle tab unselect
}
})
}
private fun populateChips(categories: List) {
val chipGroup = view?.findViewById(R.id.chipGroupCategories)
chipGroup?.removeAllViews()
// ...
createButton.setOnClickListener {
val categoryName = editText.text.toString().trim()
if (categoryName.isNotEmpty()) {
categoryVM.isCategoryNameUnique(categoryName, currentTab) { isUnique ->
if (!isUnique) textInputLayout.error = "Category already exists"
else {
// Category name is unique, proceed with adding the category
categoryVM.addCategory(
categoryName,
if (iconAdapter.getSelectedIcon() == R.drawable.ic_null_line) null else iconAdapter.getSelectedIcon(),
currentTab
)
alertDialog.dismiss()
}
}
}
}
}
// CategoriesViewModel
fun getCategoriesByType(type: String) = categoryRepository.getCategoriesByType(type).asLiveData(viewModelScope.coroutineContext)
fun addCategory(categoryName: String, categoryIconId: Int?, type: String) = viewModelScope.launch {
val categoryObject = Category(name = categoryName, iconId = categoryIconId, type = type)
categoryRepository.insertCategory(categoryObject)
}
// CategoryRepository
suspend fun insertCategory(category: Category) {
database.categoryDao().insertCategory(category)
}
fun getCategoriesByType(type: String) = database.categoryDao().getCategoriesByType(type)
// CategoryDao
@Query("SELECT * FROM categories WHERE type = :type")
fun getCategoriesByType(type: String): Flow
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertCategory(category: Category)
Подробнее здесь: https://stackoverflow.com/questions/782 ... g-livedata
Мобильная версия