BindingAdapter в Android - PullRequest
       19

BindingAdapter в Android

0 голосов
/ 23 марта 2020

Я следую этому курсу о RecyclerView и привязке данных.

Я прочитал Какая польза от адаптера связывания в Android? .

Кроме создания пользовательского / более сложного сеттера , В чем преимущество использования BindingAdapter по сравнению с «обычным» способом? Есть ли прирост производительности?

Версия1:

  • xml:

     <TextView
        android:id="@+id/sleep_length"
        android:layout_width="0dp"
        android:layout_height="20dp"
        ...
        tools:text="Wednesday" />
    
  • Адаптер :

    fun bind(item: SleepNight) {
        val res = itemView.context.resources
        sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)
    }
    

Версия 2 (привязка данных):

  • xml:

    <TextView
        android:id="@+id/sleep_length"
        android:layout_width="0dp"
        android:layout_height="20dp"
        app:sleepDurationFormatted="@{sleep}"
        ...
        tools:text="Wednesday" />
    
  • Адаптер :

    fun bind(item: SleepNight) {
        binding.sleep = item
    }
    
  • BindingUtils:

    @BindingAdapter("sleepDurationFormatted")
    fun TextView.setSleepDurationFormatted(item: SleepNight){
           text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources)
    }
    

1 Ответ

0 голосов
/ 23 марта 2020

Binding Adapter дает вам довольно хорошую функцию в настройке вида. Кажется странным!

Первый . Предположим, у вас есть ImageView, в котором отображается флаг страны.

Принять: Код страны (строка)

Действие: Показать флаг страна, если код страны нулевой, сделайте ImageView GONE.

@BindingAdapter({"android:setFlag"})
public static void setFlagImageView(ImageView imageView, String currencyCode) {
    Context context = imageView.getContext();
    if (currencyCode != null) {
        try {
            Drawable d = Drawable.createFromStream(context.getAssets().open("flags/"+currencyCode.toLowerCase()+".png"), null);
            imageView.setImageDrawable(d);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    else{
            imageView.setVisibility(View.GONE);
    }
}

Так что теперь вы можете повторно использовать этот BindinAdapter в любом другом месте.

Люди, которым нравится DataBinding, видят, что они могут уменьшить объем кода, и написать несколько логи c в xml. Вместо вспомогательных методов.

Секунда , При привязке данных вы игнорируете findViewById, потому что для вас будет создан сгенерированный файл.

Что касается производительности, я не найти в официальной документации любые признаки того, что BindingAdapter повышает производительность.

...