Код: Выделить всё
class TestFragment : Fragment() {
private lateinit var checkBox2er: CheckBox
private lateinit var checkBox3er: CheckBox
// ...
private lateinit var checkBox10er: CheckBox
private val activityViewModel: MainViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment_test, container, false)
checkBox2er = rootView.findViewById(R.id.checkbox2TT)
checkBox3er = rootView.findViewById(R.id.checkbox3TT)
// ...
checkBox10er = rootView.findViewById(R.id.checkbox10TT)
val checkBoxes = listOf(
checkBox2er, checkBox3er, checkBox4er, checkBox5er,
checkBox6er, checkBox7er, checkBox8er, checkBox9er, checkBox10er
)
// update CheckBox from ViewModel
// IS THIS ACTUALLY NEEDED?
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
activityViewModel.testFactors.collect { updatedFactors: Set ->
Log.d(javaClass.simpleName, "testFactors was updated")
checkBoxes.forEach { checkBox ->
checkBox.tagNumber?.let { rowId -> checkBox.isChecked = updatedFactors.contains(rowId) }
}
}
}
}
// update ViewModel Set when a CheckBox is clicked
checkBoxes.forEach { checkBox ->
checkBox.setOnCheckedChangeListener { clickedCheckBox, isChecked ->
clickedCheckBox.tagNumber?.let { rowId ->
Log.d(javaClass.simpleName, "clicked CheckBox $rowId")
activityViewModel.toggleCheckbox(rowId, isChecked)
}
}
}
return rootView
}
}
val View.tagNumber: Int?
get() {
val stringTag = this.tag as? String
return stringTag?.toIntOrNull()
}
Код: Выделить всё
Код: Выделить всё
class MainViewModel(application: Application) : AndroidViewModel(application) {
private val writableTestFactors: MutableStateFlow = MutableStateFlow(sortedSetOf(2,3,4,5,6,7,8,9,10))
val testFactors: StateFlow = writableTestFactors
fun toggleCheckbox(toggleRow: Int, isChecked: Boolean) {
val newSortedSet = TreeSet(testFactors.value)
if (isChecked) {
newSortedSet.add(toggleRow)
} else {
newSortedSet.remove(toggleRow)
}
writableTestFactors.value = newSortedSet
}
}
Каким должен быть единственный источник истины здесь, и как бы я правильно реализовал подход MVVM? < /p>
Подробнее здесь: https://stackoverflow.com/questions/793 ... -viewmodel
Мобильная версия