У меня есть куча изображений на экране, например:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/cardImageView0"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
android:layout_weight="1"
android:contentDescription="@string/card"
android:onClick="@{() -> viewModel.clicked(0)}"
android:visibility="@{safeUnbox(viewModel.isVisible(0)) ? View.VISIBLE : View.INVISIBLE}"
app:imageResource="@{viewModel.cardResource(0)}" />
<ImageView
android:id="@+id/cardImageView1"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
android:layout_weight="1"
android:contentDescription="@string/card"
android:onClick="@{() -> viewModel.clicked(1)}"
android:visibility="@{safeUnbox(viewModel.isVisible(1)) ? View.VISIBLE : View.INVISIBLE}"
app:imageResource="@{viewModel.imgRes(1)}" />
<ImageView
android:id="@+id/cardImageView2"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
android:layout_weight="1"
android:contentDescription="@string/card"
android:onClick="@{() -> viewModel.clicked(2)}"
android:visibility="@{safeUnbox(viewModel.isVisible(2)) ? View.VISIBLE : View.INVISIBLE}"
app:imageResource="@{viewModel.imgRes(2)}" />
<ImageView
android:id="@+id/cardImageView3"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
android:layout_weight="1"
android:contentDescription="@string/card"
android:onClick="@{() -> viewModel.clicked(3)}"
android:visibility="@{safeUnbox(viewModel.isVisible(3)) ? View.VISIBLE : View.INVISIBLE}"
app:imageResource="@{viewModel.imgRes(3)}" />
</LinearLayout>
Которые я хочу изменить при нажатии:
- сначала изображение должно быть изменено(основываясь на том факте, что
app:imageResource="@{viewModel.imgRes(3)}"
возвращает новый ресурс для рендеринга) - секунда, когда изображение должно стать невидимым (за что отвечает
android:visibility...
), в некоторых случаях
Iне знаю, как привязать конкретное изображение к этому набору действий.
Для видимого / невидимого я думал об обёртывании пары (Int, Boolean) в LiveData и делал что-то вроде @{safeUnbox(viewModel.isVisible(3).first == 3 && viewModel.isVisible(3).second) ? View.VISIBLE : View.INVISIBLE}
в пользовательском интерфейсе. , но это не работает и выглядит глупо.
Другая идея - это конкретный метод (или, скорее, val
) в viewmodel для каждого изображения
Проблема: Я пытаюсь сделать определенное изображение из множества похожих, чтобы оно реагировало на нажатие, но я не знаю, как реализовать отличительную часть на стороне пользовательского интерфейса (вид).
Должен быть лучший способ. Любые направления, пожалуйста? Или ключевые слова?
Моя ViewModel:
class MyViewModel : ViewModel() {
private val stack = Stack()
fun imgRes(pos: Int) = MutableLiveData(stack.getResource(pos))
fun isVisible(pos: Int) = MutableLiveData<Boolean>().apply { value = true }
fun clicked(pos: Int) {
stack.selectedAtPosition(pos).forEach {
stack.hide(it)
isVisible(it).value = false
}
}
}
Кроме того, я открыт для любых предложений по улучшению материала выше. Большое спасибо