Какая польза от обязательного адаптера в Android? - PullRequest
1 голос
/ 25 мая 2019

Я читал статьи о привязке адаптера в Android, но, похоже, я этого не понимаю. Когда используется адаптер для переплета? Может кто-нибудь объяснить это на простом примере?

В статье, которую я прочитал, был адаптер привязки в Основном действии. Адаптер привязки имел параметр «toastMessage», и очевидно, что метод, аннотированный этим адаптером привязки, вызывался всякий раз, когда «toastMessage» (который был атрибутом в классе viewModel) изменился.

Я не понимаю, зачем нам это делать.

Объяснение на простом примере очень помогло бы.

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Адаптеры привязки используются для установки пользовательских параметров для некоторых свойств ваших представлений.Наиболее распространенный вариант использования, о котором я могу думать, это установка изображения на ImageView, где загрузка изображения в основном выполняется из потока пользовательского интерфейса.

У большинства из нас есть предпочтительная библиотека загрузки изображений для загрузки изображений.Для каждого изображения, которое вы хотите загрузить, вы должны написать код для загрузки URL-адреса с удаленного (или локального) и установить его для нашего изображения.Конечно, у вас может быть какой-то полезный метод, когда вы увидите этот шаблон в каждом месте, где у вас есть изображение.

Связывающие адаптеры делают это немного проще.Вы устанавливаете атрибут в XML, и библиотека привязки данных будет искать адаптер привязки, чтобы установить это свойство для вашего представления.Поскольку данные являются наблюдаемыми, изменения будут запускаться в представлении при каждом изменении данных.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:imageUrl="@{data.imageUrl}"/>
@BindingAdapter("imageUrl")
public static void setImageUrl(ImageView imageView, String url) {
    if (url == null) {
        imageView.setImageDrawable(null);
    } else {
        Picasso.get().load(url).into(imageView); // replace with your fav image loading lib
    }
}

doc предоставляет несколько таких примеров, в которых вы хотели бы использовать это.Эта статья Джорджа Маунта также очень четко объясняет, где и почему вы можете использовать это, если вы используете привязку данных.

0 голосов
/ 26 мая 2019

Связывающие адаптеры отвечают за выполнение соответствующих вызовов инфраструктуры для установки значений.

Когда вы используете data binding в своем приложении, установка значений в views - это обычное дело. Пример ниже:

 <ProgressBar
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         android:visibility="@{viewmodel.loadingData?View.VISIBLE:View.GONE}"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>

Но иногда вы хотите сделать что-то особенное в ваших методах настройки. Например, у вас есть RecyclerView в вашем XML, и вы хотите определить его адаптер. Вы можете сделать это, определив его с помощью bindingAdapter в своем коде для него.

<android.support.v7.widget.RecyclerView
            android:id="@+id/rv_main_articles"
            app:adapter="@{viewmodel.articles}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            android:layout_width="0dp"
            android:layout_height="0dp"/>

В основном используются два адаптера привязки:

1- Для RecyclerView:

@JvmStatic
        @BindingAdapter("app:adapter")
        fun <T> setItems(recyclerView: RecyclerView, items: List<T>?) {

            Log.d(TAG, "articles:[$items]")

            if (recyclerView.adapter is HomeAdapter) {

                if (items != null) {
                    (recyclerView.adapter as HomeAdapter).swapData(items)
                }

            }
        }

2- Для загрузки изображений в ваши ImageView (s)

@JvmStatic
        @BindingAdapter("app:loadImage")
        fun setImageResource(view: ImageView, imageUrl: String?) {

            val context = view.context

            val options = RequestOptions()
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)


            imageUrl?.let {

                Glide.with(context)
                    .setDefaultRequestOptions(options)
                    .load(imageUrl)
                    .transition(DrawableTransitionOptions.withCrossFade(1000))
                    .into(view)
            }
        }

Подробнее: ссылка

...