Java 使用数据绑定获取recyclerView中已单击项的位置
谢谢你阅读我的问题, 我已经使用数据绑定在recyclerView中实现了onClick,但是我可以将对象本身发送到click函数,但是我需要项目位置可以在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
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);
}