Вы должны создать группу Radio и управлять оттуда, то есть родителем:
Вот один из способов сделать это:
@LayoutSpec
object CrgSpec {
@OnCreateLayout
fun onCreateLayout(
c: ComponentContext,
@Prop viewModel: ViewModel,
@State fields: ArrayList<RadioItem>,
@Prop parentId: String
): Component? {
val row =
Row.create(c)
.alignItems(YogaAlign.CENTER)
.alignContent(YogaAlign.SPACE_AROUND)
.flexGrow(1F)
.wrap(YogaWrap.WRAP)
fields.forEach { item ->
row.child(
CRadio.create(c)
.value(item.text)
.clickHandler(Crg.onClicked(c, item.id, item.text))
.isChecked(item.isChecked)
.id(item.id)
.build()
)
}
val column = Column.create(c)
.paddingDip(YogaEdge.TOP, 20F)
.child(row.build())
return column.child(
TextInput.create(c)
//.visibleHandler()
.backgroundRes(R.drawable.edit_text_bg)
.build()
).build()
}
@OnCreateInitialState
fun onCreateInitialState(
c: ComponentContext?,
fields: StateValue<ArrayList<RadioItem>>,
@Prop initChecked: ArrayList<RadioItem>
) {
fields.set(initChecked)
}
@OnUpdateState
fun updateCheckboxState(
fields: StateValue<ArrayList<RadioItem>>,
@Param id: String
) {
fields.get()?.let { radioItem ->
radioItem.forEach {
it.isChecked = it.id == id
}
fields.set(radioItem)
}
}
@OnUpdateState
fun updateCheckbox(
fields: StateValue<ArrayList<RadioItem>>,
@Param id: String
) {
fields.get()?.let { radioItem ->
radioItem.forEach {
it.isChecked = it.id == id
}
fields.set(radioItem)
}
}
@OnEvent(ClickEvent::class)
fun onClicked(
c: ComponentContext?,
@Prop viewModel: ViewModel,
@Param id: String,
@Prop parentId: String,
@Param itemValue: String
) {
Timber.d("id is: $id")
CirclesRadioGroup.updateCheckbox(c, id)
viewModel.onRadioUpdate(
id,
parentId,
itemValue
)
}
}
Ссылки:
Бонус: - Это также очень хороший пример того, как вы получите обратные вызовы действий пользователя в вашей модели представления, и компактный пример управляемого сервером интерфейса пользователя на Android.