Связывание данных Android с передачей параметров в метод - PullRequest
0 голосов
/ 10 октября 2018

Во-первых, этот вопрос не относится к передаче параметра события onClick.

У меня есть класс DateUtil с одним методом, как показано ниже:

public static String formatDate(long date) {
        SimpleDateFormat dateFormat;
        dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
        Calendar c = Calendar.getInstance();

        dateFormat.setTimeZone(TimeZone.getDefault());
        c.setTimeInMillis(date);
        return dateFormat.format(c.getTimeInMillis());
    }

Моя модель CommentEntity имеет следующие атрибуты:

 private int id;
 private int productId;
 private String text;
 private Date postedAt;

Теперь в одном из макетов я отображаю комментарии.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="comment"
                  type="com.example.entity.CommentEntity"/>
        <variable
        name="dateUtil"
        type="com.example.util.DateUtil"/>

    </data>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:layout_alignParentRight="true"
                android:layout_below="@id/item_comment_text"

                //This line gives error for data binding
                android:text="@{dateUtil.formatDate(comment.postedAt.time)}"/>
</layout>

Я получаю ошибку:

не удается найти метод formatDate (com.example.util.DateUtil) в классе long

Теперь для того же, если я изменю метод formatDate (), так как он по умолчанию займет текущее время, следовательно, удалив передачу параметров в привязке данных, он будет работать отлично.

Так что я делаю что-то не так или это так?Жук?

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

1 Ответ

0 голосов
/ 10 октября 2018

Попробуйте следующий подход:

  1. Не берите объект класса DateUtil непосредственно из привязки данных в xml

Создайте один BindingAdapter метод в вашей CommentEntity модели класса следующим образом:

@BindingAdapter("android:text")
public static void setPaddingLeft(TextView view, long date) {
    view.setText(DateUtil.formatDate(long));
}

Затем используйте как ниже для xml:

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:layout_alignParentRight="true"
            android:layout_below="@id/item_comment_text"
            android:text="@{comment.postedAt.time}"/>

Объяснение:

Когда вы захотите применить некоторую пользовательскую логику для вашего представления на основе модели данных , выдля этого нужно использовать BindingAdapter .Таким образом, вы можете предоставить какой-нибудь пользовательский тег или использовать любой тег по умолчанию android:, для которого вам нужно установить логику.

Я отказал вам в использовании DateUtil для привязки адаптера, потому что вы можете использовать его методы где-тоеще тоже.Поэтому предлагается создать новый метод в вашей модели вместо этой логики, чтобы основная логика оставалась нетронутой. (Вы можете использовать DateUtils для этой логики, вам просто нужно сделать это как BindingAdapter ).

...