Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用数据绑定获取recyclerView中已单击项的位置_Java_Android_Xml_Data Binding - Fatal编程技术网

Java 使用数据绑定获取recyclerView中已单击项的位置

Java 使用数据绑定获取recyclerView中已单击项的位置,java,android,xml,data-binding,Java,Android,Xml,Data Binding,谢谢你阅读我的问题, 我已经使用数据绑定在recyclerView中实现了onClick,但是我可以将对象本身发送到click函数,但是我需要项目位置可以在onClick中获取项目位置吗? 以下是如何在recyclerView项目中实现单击: android:onClick="@{ (v) -> model.click(obj) }" 在OnBindViewHolder中单击视图,位置为视图位置使用数据绑定时,可以在ViewHolder中使用一个公开属性。 只需调用adapter

谢谢你阅读我的问题, 我已经使用数据绑定在recyclerView中实现了onClick,但是我可以将对象本身发送到click函数,但是我需要项目位置可以在
onClick
中获取项目位置吗? 以下是如何在recyclerView项目中实现单击:

    android:onClick="@{ (v) -> model.click(obj) }"

在OnBindViewHolder中单击视图,位置为视图位置

使用数据绑定时,可以在ViewHolder中使用一个公开属性。
只需调用
adapterPosition

您可以使用视图持有者中的
adapterPosition
将项目位置传递给ItemView,然后您可以将
itemPosition
传递给
android:onClick=“@{(v)->模型。单击(obj,itemPosition)}”

类通用持有者(
私有val绑定:ViewDataBinding,
val侦听器:单击列表器
) :
RecyclerView.ViewHolder(binding.root){
趣味绑定(数据:数据模型){
binding.setVariable(BR.item,数据)
binding.setVariable(BR.presenter,listener)
binding.setVariable(BR.itemPosition,adapterPosition)
binding.executePendingBindings()
}
}
使用界面 创建接口

interface ItemClickListener{
    void itemClicked(int position)
}
在XML中使用ItemClickListener和Integer,并像这样调用
onClick()
上的接口方法

android:onClick="@{()->itemClickListener.itemClicked(position)}"
演示XML代码片段my_item.XML

<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools">
   <data>
      <variable
          name="itemClickListener"
          type="ItemClickListener" />
       <variable
          name="position"
          type="Integer"/>
    </data>
    <LinerLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <ImageView
          android:id="@+id/offer_image"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:onClick="@{()->itemClickListener.itemClicked(position)}"
        />
    </LinearLayout>
</layout>

你的适配器代码在哪里?以及型号代码alseo?您可以将您的位置从适配器传递到布局中。在
onBindViewHolder
中,您可以调用
holder.binding.setVariable(BR.itemPosition,position)
关键是我想使用数据绑定并在那里添加单击功能,所以我不打算使用这种方式。正如我说的使用数据绑定!哦,对不起,我没有仔细阅读使用数据绑定的问题,你们可以在这里看到是的,这是使用完整的谢谢@Rohit Singh
android:onClick="@{()->itemClickListener.itemClicked(position)}"
<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools">
   <data>
      <variable
          name="itemClickListener"
          type="ItemClickListener" />
       <variable
          name="position"
          type="Integer"/>
    </data>
    <LinerLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <ImageView
          android:id="@+id/offer_image"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:onClick="@{()->itemClickListener.itemClicked(position)}"
        />
    </LinearLayout>
</layout>
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

      private ItemClickListener itemClickListener;

      public MyAdapter(Context){
          itemClickListener = (ItemClickListener)context;
      }

      @Override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

          MyItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
            R.layout.my_item, parent, false);
          return new MyViewHolder(binding);
       }

       @Override
       public void onBindViewHolder(@NonNull OfferViewHolder holder, int position) {
          holder.bind(position);
       }

       class MyViewHolder extends RecyclerView.ViewHolder{

            private MyItemBinding binding;

            public OfferViewHolder(@NonNull ItemOfferBinding binding) {
               super(binding.getRoot());
               this.binding = binding;
            }

            private void bind(int position){
               binding.setItemClickListener(itemClickListener);    //<----This is important
               binding.setPosition(position);                      //<-- This is important
            }

       }

 }
MyActicity extends AppCompatActivity{
      
      MyAdapter adapter = new Adapter(this);
}