有什么方法可以使用绑定(bind)库将自定义onSomeEventListener
连接到属性吗?为 onClick
提供的示例很简单,它们都使用“on”前缀和单方法接口(interface)监听器,那么“add”前缀和更复杂的情况又如何呢?
想象一下,我想在RecyclerView.addOnItemTouchListener上使用自定义连接逻辑,确定从SimpleOnItemTouchListener.onTouchEvent触摸了 subview 并将其传递给我的 View 模型,我该如何实现呢?
我想结束这样的事情:
<RecyclerView
app:onItemTouch="@{handlers::recyclerViewOnItemTouch}"/>
public class Handlers {
public void recyclerViewOnItemTouch(View view) { ... }
}
使用BindingAdapter和InverseBindingListener向绑定(bind)框架通知有关自定义属性更新时,是否有与方法类似的方法?
@BindingAdapter("app:someAttrChanged")
public static void setListener(View view, InverseBindingListener listener)
最佳答案
经过一些调查和反复试验,我找到了解决方案。
当然,您需要激活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;
}
}