Как обновить значение внутри вложенных живых данных?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как обновить значение внутри вложенных живых данных?

Сообщение Anonymous »

У меня есть класс под названием «Элемент опроса», который является дочерним для другого класса под названием «Данные опроса», как показано ниже.

Код: Выделить всё

@Parcelize
data class DataSurvey(
@field:SerializedName("name")
val name: String,

@field:SerializedName("id")
val id: String,

@field:SerializedName("items")
val items: List,

@field:SerializedName("mobile_only")
val isMobile: Boolean,
) : Parcelable

@Parcelize
data class SurveyItem(
@field:SerializedName("survey_id")
val surveyId: String,

@field:SerializedName("name")
val name: String,

@field:SerializedName("survey_type_id")
val surveyTypeId: Int,

@field:SerializedName("id")
val id: String,

@field:SerializedName("value")
var valueItem: @RawValue Any? = null,

@field:SerializedName("options")
var options: ArrayList? = arrayListOf(),

var imageUri: Uri? = null,

var isComplete: @RawValue MutableLiveData = MutableLiveData(false),
) : Parcelable
Я также создал livedata и mediatorlivedata для наблюдения за двумя другими живыми данными, поскольку мне нужно, чтобы они не были нулевыми при отправке на сервер.

Код: Выделить всё

class CheckInViewModel : ViewModel() {
// LiveData for etCheckInNotes
val etCheckInNotesLiveData: MutableLiveData = MutableLiveData()

// Combined LiveData for etCheckInNotes and surveyItem
val combinedLiveData: MediatorLiveData = MediatorLiveData()

val chosenSurvey = MutableLiveData()

val listImageUri = MutableLiveData().apply {
value = arrayListOf()
}

init {
combinedLiveData.addSource(chosenSurvey) { surveyItem ->
val checkInData = CheckInData(
notes = etCheckInNotesLiveData.value,
surveyItems = surveyItem,
imageUri = listImageUri.value ?: arrayListOf(),
)
combinedLiveData.value = checkInData
}

combinedLiveData.addSource(etCheckInNotesLiveData) { notes ->
val checkInData = CheckInData(
notes = notes,
surveyItems = chosenSurvey.value ?: arrayListOf(),
imageUri = listImageUri.value ?: arrayListOf(),
)
combinedLiveData.value = checkInData
}

combinedLiveData.addSource(listImageUri) { imageUri ->
val checkInData = CheckInData(
notes = etCheckInNotesLiveData.value,
surveyItems = chosenSurvey.value ?: arrayListOf(),
imageUri = imageUri,
)
combinedLiveData.value = checkInData
}
}

data class CheckInData(
val notes: String?,
val surveyItems: ArrayList,
val imageUri: ArrayList,
)
}
Ниже я наблюдаю объединенные данные в реальном времени

Код: Выделить всё

// Observe combinedLiveData
checkInViewModel.combinedLiveData.observe(this) { (etCheckInNotes, surveyData, uriImage) ->
val allValuesPresent =
surveyData.all { it.items.all { item -> item.valueItem != null } }

Log.e(TAG, "allvalues : $allValuesPresent")
Log.e(TAG, "etcheckinnotes : ${etCheckInNotes.toString()}")
Log.e(TAG, "etcheckinnotes null or empty ${etCheckInNotes.isNullOrEmpty()}")
Log.e(TAG, "surveyItem $surveyData")
Log.e(TAG, "buttonStatus : ${binding.btCheckInSubmit.getButtonEnable()}")
Log.e(TAG, "uriImage $uriImage")

if (allValuesPresent &&  !etCheckInNotes.isNullOrEmpty()) {
binding.btCheckInSubmit.setButtonEnabled(true)
binding.btCheckInSubmit.showLoading(false)
} else {
binding.btCheckInSubmit.setButtonEnabled(false)
}
}
Но когда я пытаюсь обновить их внутри recyclerviewadapter, представление всегда обновляется, когда я набираю только один символ.

Код: Выделить всё

binding.tiSurveyItemDesc.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int,
) {
}

override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
//                    Log.e("test", "$s")
val note = s.toString()
//                    viewModel.updateSurveyItemValueItem(
//                        surveyData.surveyId,
//                        surveyData.id,
//                        note
//                    )
// Update the valueItem of the survey item and notify observers

viewModel.viewModelScope.launch {
viewModel.chosenSurvey.value?.get(outerIndex)?.items?.get(position)?.valueItem =
note
//                        viewModel.chosenSurvey.value = viewModel.chosenSurvey.value
}
}

override fun afterTextChanged(s: Editable?) {

}
})

binding.tiSurveyItemDesc.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_NEXT) {
// Hilangkan fokus dari TextInputEditText
binding.tiSurveyItemDesc.clearFocus()
viewModel.chosenSurvey.postValue(viewModel.chosenSurvey.value) // Notify observers

// Opsional: Sembunyikan keyboard
//                    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
//                    imm.hideSoftInputFromWindow(v.windowToken, 0)

true // Return true untuk menandakan event sudah ditangani
} else {
false
}
}
Я знаю, что это вызвано ценностью публикации. Но как мне наблюдать за тремя несколькими живыми данными, обновлять одно значение живых данных внутри живых данных, не обновляя пользовательский интерфейс?
Это предварительный просмотр:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... d-livedata
Ответить

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

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

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

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

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