Пользовательские атрибуты событий в приложении привязок Android: onMyEvent

Есть ли способ подключить пользовательский onSomeEventListener к атрибуту с помощью библиотеки привязок? Примеры для onClick просты, и все они используют ' on' префикс и прослушиватели интерфейса с одним методом, а как насчет добавления префикса и более сложных сценариев?

Представьте, что я хочу использовать пользовательскую логику подключения на RecyclerView.addOnItemTouchListener, определяющий касание дочернего представления из SimpleOnItemTouchListener.onTouchEvent и передать его в мою модель представления, как могу ли я этого добиться?

Я хочу закончить что-то вроде этого:

<RecyclerView
    app:onItemTouch="@{handlers::recyclerViewOnItemTouch}"/>

public class Handlers {
    public void recyclerViewOnItemTouch(View view) { ... }
}

Есть ли что-то похожее на подход при уведомлении структуры привязки об обновлении вашего пользовательского свойства с помощью BindingAdapter и InverseBindingListener ?

@BindingAdapter("app:someAttrChanged") 
public static void setListener(View view, InverseBindingListener listener)

person Yuriy Naydenov    schedule 01.07.2016    source источник


Ответы (1)


После некоторого расследования, проб и ошибок я нашел решение.

Конечно, вам нужно будет активировать Binding в вашем Activity или Fragment и установить для него экземпляр ClickHandler, а также иметь переменную для него в вашем xml для ClickHandler. Предполагая, что вы это уже знаете, я продолжу:

Одна часть волшебства заключается в использовании app:addOnItemTouchListener вместо RecyclerView:

<android.support.v7.widget.RecyclerView
    android:id="@+id/rec_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:addOnItemTouchListener="@{clickHandler.touchListener}"/>

Другая часть — ClickHandler.class:

public class ClickHandler {

    public RecyclerView.OnItemTouchListener touchListener;

    public ClickHandler(){
        //initialize the instance of your touchListener in the constructor
        touchListener = new RecyclerView.SimpleOnItemTouchListener(){
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e)     {
                //allow clicks
                return true;
            }

            @Override
                public void onTouchEvent(RecyclerView rv, MotionEvent e) {
                //check if it is working / check if we get the touch event:
                Log.d("onTouchEvent", "RecView: " + rv.getId() + "\nMotionEvent: "+ e.getAction());
            }
        };
    }

    /* last but not least: a method which returns the touchlistener. 
       You can rename the method, but don't forget to rename the attribute in the xml, too. */
    public RecyclerView.OnItemTouchListener touchListener(){
        return touchListener;
    }
}
person yennsarah    schedule 05.07.2016