我有一个RecyclerView,它在适配器的布局中声明了一个数据绑定项:
<data>
<variable
name="item"
type="com...myType"/>
<variable
name="handlers"
type="com...myHandlers"/>
</data>
<LinearLayout>
<TextView
android:text="@{item.field}" />
<Button
android:onClick="@{handlers::onClick}" />
</LinearLayout>
似乎所有设置都正确,可以调用onClick处理程序,但是问题是,它似乎接受的唯一签名是
public class MyHandlers
{
public void onClick(View view)
{
// Code
}
}
这正是为我做的事,因为它给我的视图是我单击以获得AppCompatButton
的{{1}},它没有有关数据绑定项的信息。我尝试过检查父母的几个等级,但没有发现任何可以给我数据绑定项的东西。
如何从onClick
中获取数据绑定项目,以便知道单击了哪个项目?
答案 0 :(得分:1)
您使用的是方法参考。使用方法引用时,目标方法的参数应与您使用的侦听器的参数匹配。在这种情况下,对于onClick方法,参数是View,因此您的方法必须将View作为参数。 如果要将其他内容传递给回调,则应使用 listener绑定。 official documentation中对此进行了讨论 上面给出了一个详细的示例,我不再重复,但是我想添加一些内容。如果不需要view参数,则不必传递它。您可以这样声明:
android:onClick="@{() -> handlers.onClick(item)}"
当然,您应该相应地更改onClick方法的参数类型。
答案 1 :(得分:0)
创建一个监听器界面,例如:
1) 创建以下界面:
public interface ItemOnClickListener {
void onClickItem(View v, myType item);
}
2)像这样更改项目布局xml文件:
<layout>
<data>
<variable
name="listener"
type="YOUR_PACKAGE_GOES_HERE.ItemOnClickListener" />
</data>
<Button
android:onClick="@{(v) -> listener.onClickItem(v, item)}" />
</layout>
3)在适配器中实现上述接口:
public class MyRecyclerViewAdapter implements ItemOnClickListener
4)覆盖适配器中的ItemOnClickListener方法
@Override
public void onClickItem(View v, myType item) {
// your code goes here
}
5)最后,在您的onBindViewHolder()
中,为侦听器实例提供数据绑定:
itemBinding.setListener(this);