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

时间:2018-12-30 13:42:52

标签: java android xml data-binding

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

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

4 个答案:

答案 0 :(得分:3)

使用界面

创建界面

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>

在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
            }

       }

 }

活动代码

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

答案 1 :(得分:0)

 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        holder.hTextview_Score.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
}

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

答案 2 :(得分:0)

使用数据绑定时,可以在ViewHolder内部使用一个公开的属性。 只需致电adapterPosition

答案 3 :(得分:0)

您可以在视图持有器中使用<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="app"></div>将项目位置传递给ItemView,然后可以将adapterPosition传递给itemPosition

android:onClick="@{ (v) -> model.click(obj, itemPosition) }"
相关问题