Фильтрация и управление LiveDataAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Фильтрация и управление LiveData

Сообщение Anonymous »

В моем приложении для Android возникла проблема: категории, отображаемые в ChipGroup, не обновляются правильно после добавления новой категории. Вот сценарий:
  • У меня есть группа 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»