Привязка данных: уведомить конкретное изображение (из группы), чтобы изменить - PullRequest
0 голосов
/ 08 октября 2019

У меня есть куча изображений на экране, например:

<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
        }
    }
}

Кроме того, я открыт для любых предложений по улучшению материала выше. Большое спасибо

...