从RecyclerView onClick获取数据绑定项

时间:2019-01-11 23:23:06

标签: android android-recyclerview recycler-adapter android-databinding

我有一个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中获取数据绑定项目,以便知道单击了哪个项目?

2 个答案:

答案 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);
相关问题