简体   繁体   English

使用 dataBinding 在 recyclerView 中获取单击项的位置

[英]get position of clicked item in recyclerView using dataBinding

thank you for reading my question, I've Implemented onClick in recyclerView using dataBinding but I can send the object itself to click function but I need the item position is it possible to get item position in onClick ?感谢您阅读我的问题,我已经使用 dataBinding 在 recyclerView 中实现了 onClick 但我可以将对象本身发送到 click 函数,但我需要项目位置是否可以在onClick获取项目位置? here is how click is implemented in the recyclerView item:这是在 recyclerView 项中实现 click 的方式:

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

Use Interface使用界面

Create Interface创建接口

interface ItemClickListener{
    void itemClicked(int position)
}

Use ItemClickListener and Integer in XML and call interface method on onClick() like this在 XML 中使用 ItemClickListener 和 Integer 并像这样在onClick()上调用接口方法

android:onClick="@{()->itemClickListener.itemClicked(position)}"

Demo XML snippet my_item.xml演示 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>

Set ItemClickListener and Position in Adapter在 Adapter 中设置 ItemClickListener 和 Position

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
            }

       }

 }

Activity Code活动代码

MyActicity extends AppCompatActivity{
      
      MyAdapter adapter = new Adapter(this);
}
 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        holder.hTextview_Score.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
}

make click of your view in OnBindViewHolder and position is position of view在 OnBindViewHolder 中单击您的视图,位置是视图的位置

There is an exposed property that you can use inside ViewHolder, when using databinding.在使用数据绑定时,您可以在 ViewHolder 内部使用一个公开的属性。 Just call adapterPosition .只需调用adapterPosition

You can use adapterPosition in view holder to pass item position to ItemView and then you can pass itemPosition to android:onClick="@{ (v) -> model.click(obj, itemPosition) }"您可以在视图持有者中使用adapterPosition将项目位置传递给 ItemView,然后您可以将itemPosition传递给android:onClick="@{ (v) -> model.click(obj, itemPosition) }"

 class GeneralHolder<DataModel, ClickListner>(
        private val binding: ViewDataBinding,
        val listener: ClickListner
    ) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(data: DataModel) {
            binding.setVariable(BR.item, data)
            binding.setVariable(BR.presenter, listener)
            binding.setVariable(BR.itemPosition, adapterPosition)
            binding.executePendingBindings()
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM