Как прокрутить до позиции в ScrollView с помощью привязки данных?

#android #data-binding #scrollview

#Android #привязка данных #scrollview

Вопрос:

Я использую привязку данных в своих приложениях для Android, но есть один вопрос, на который никто не мог мне ответить…

Если мой ScrollView содержит некоторый TextInputLayout, содержащий элементы InputditText, как я могу прокрутить до определенного textinputlayout с помощью привязки данных? В настоящее время я использую Butterknife, привязываю scrollview и должен прокручивать эту позицию этого представления вручную, но мне интересно, нет ли другого способа сделать это.

У кого-нибудь есть идея?

Комментарии:

1. Вероятно, это не совсем другой подход, который вы ищете. Но я думаю, что вы можете избавиться от butterknife, по крайней мере, используя поля связующего: binding.myscroller.scrollTo (если вы установите идентификатор представления в R.id.myscroller здесь)

2. Да, @Till, ты абсолютно прав. После еще нескольких исследований я понял, что я могу получить такой привязанный вид! 😉

Ответ №1:

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

 @BindingAdapter("scrollTo")
public static void scrollTo(ScrollView view, int viewId) {

    if (viewId == 0) {
        view.scrollTo(0, 0);
        return;
    }

    View v = view.findViewById(viewId);
    view.scrollTo(0, v.getTop());
    v.requestFocus();
}
  

Из-за использования привязки данных я могу легко добавить этот адаптер в свой xml:

 <?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="viewModel"
            type="com.grumpyshoe.myapp.features.dashboard.viewmodel.DashboardViewmodel"/>
    </data>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:id="@ id/root_dashboard"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/transparent"
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:orientation="vertical">

        <ScrollView
            android:id="@ id/bank_account_scroll_wrapper"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true"
            app:scrollTo="@{viewModel.focusedViewId}"> 

        [...]
    </LinearLayout>
</layout>
  

Комментарии:

1. Не забывайте о static в объявлении метода. Я замалчивал это в ответе @grumpyshoe.

2. Как вы вызываете scrollTo функцию, если я не могу передать ScrollView в качестве параметра?

3. @AntonisTsimourtos Я не понимаю, почему вы не можете передать ScrollView в качестве параметра !? Любой написанный вами BindingAdapter будет иметь собственное представление в качестве первого параметра, а второй — тот, который вы передали. Можете ли вы объяснить подробнее или привести небольшой пример того, что или где вы хотите использовать?

4. Извините, мне пришлось очистить сборку проекта, потому что он не смог найти ScrollView через findViewBy