【问题标题】:get position of clicked item in recyclerView using dataBinding使用 dataBinding 在 recyclerView 中获取单击项目的位置
【发布时间】:2023-04-10 18:49:01
【问题描述】:

感谢您阅读我的问题, 我已经使用 dataBinding 在 recyclerView 中实现了 onClick,但我可以将对象本身发送到 click 函数,但我需要项目位置是否可以在 onClick 中获取项目位置? 这是recyclerView项目中点击的实现方式:

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

【问题讨论】:

  • 您的适配器代码在哪里?还有型号代码?
  • 您可以将您的位置从您的适配器传递到布局中。在onBindViewHolder,您可以拨打holder.binding.setVariable(BR.itemPosition, position)

标签: java android xml data-binding


【解决方案1】:

使用界面

创建接口

interface ItemClickListener{
    void itemClicked(int position)
}

在 XML 中使用 ItemClickListener 和 Integer 并像这样在onClick() 上调用接口方法

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

演示 XML sn -p 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>

在适配器中设置 ItemClickListener 和位置

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);
}

【讨论】:

  • 是的,已经用完了,谢谢@Rohit Singh
【解决方案2】:
 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        holder.hTextview_Score.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
}

在 OnBindViewHolder 中单击您的视图,位置是视图的位置

【讨论】:

  • 重点是我想使用数据绑定并在那里添加点击功能所以我不会使用这种方式。
  • 正如我所说的使用数据绑定!
  • 哦,对不起,我没有仔细阅读使用数据绑定的问题,你可以在这里看到stackoverflow.com/questions/46874441/…
【解决方案3】:

当使用数据绑定时,您可以在 ViewHolder 中使用一个公开的属性。 只需拨打adapterPosition

【讨论】:

    【解决方案4】:

    您可以在视图持有者中使用adapterPosition 将项目位置传递给ItemView,然后您可以将itemPosition 传递给android:onClick="@{ (v) -&gt; 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()
            }
        }
    

    【讨论】:

    • 如果您认为我对最初问题的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记 (✔️) 来接受它。 Upvote answer to make 对其他人也很有用。我真的很感激。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-04-11
    相关资源
    最近更新 更多