似乎在适配器中执行 @Override
public void onBindViewHolder(@NonNull YourViewHolder holder, int i) {
...
holder.binding.setPosition(i);
}
时,您想要设置将触发data binding
的变量,以及选择填充每个项目的数据绑定方法。由于它是变量,而不是方法。
我刚刚开始使用databinding
,现在我仍然坚持在recyclerView
中以databinding的方式实现点击监听器。我有这样的工作:
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemBookCoversBinding binding = ItemBookCoversBinding.inflate(LayoutInflater.from(context), parent, false);
final BookViewHolder bookViewHolder = new BookViewHolder(binding);
bookViewHolder.binding.bookDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.deleteCover(bookViewHolder.getAdapterPosition());
}
});
bookViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.changeCover(bookViewHolder.getAdapterPosition());
}
});
return bookViewHolder;
}
从字面上看还可以,但是我没有在databinding
中使用clickListener
。我试图像这样在我的布局中添加一个可变位置:
<data>
<variable
name="position"
type="int" />
<variable
name="listener"
type="....interfaces.Listener" />
</data>
<ImageView
android:id="@+id/book_cover"
coverImage="@{bookImages.storageRef}"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_dark"
android:onClick="@{() -> listener.changeCover(position)}"
android:src="@drawable/placeholder" />
以及在适配器的onCreateViewHolder
中:
bookViewHolder.binding.setVariable(BR.position, bookViewHolder.getAdapterPosition());
或此:
binding.setPosition(bookViewHolder.getAdapterPosition());
onClick
在两种情况下均按预期工作,但bookViewHolder.getAdapterPosition()
返回-1
,NO_POSITION
我在这里想念什么?在NO_POSITION
中实现databinding
onClickListener
的最佳方法是什么?
我已经有一些有效的方法,但不是RecyclerView
方法。
这不起作用,因为您在视图创建时分配了变量。目前,您的databinding
没有adapterPositions。我不知道它们的工作原理,但是每当我尝试在点击侦听器之外使用它时,它总是返回-1。目前,它们尚未连接到ViewHolder
,因此,如果没有一些异步工作或layoutChangeListeners,您将无法获得它,并且在RecyclerView
]中它可能始终为-1。
解决方案是从其他地方获取onCreateViewHolder
的位置。您可以像这样覆盖ViewHolder
方法后,使用viewType
变量获取此信息:
getItemViewType(int pos)
编辑
您可能会遇到这种方法的一个问题(在我看来,您可能会遇到的问题是,当您循环使用 @Override
public int getItemViewType(int position) {
return position;
}
@NonNull
@Override
public PlaylistViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTypeButActuallyItIsPosition) {
...
binding.setPosition(viewTypeButActuallyItIsPosition);
...
}
时,ImageView
的位置设置错误,因为将调用ViewHolders
方法而不会调用onBindViewHolder
时,UI将被更改,但绑定变量将保持不变,因此正确的方法是在onCreateViewHolder
方法中分配此位置。这意味着您应该将绑定保留在onBindViewHolder
类中,并将其保持公开状态,以便可以在ViewHolder
]中进行访问
onBindViewHolder
似乎在适配器中执行 @Override
public void onBindViewHolder(@NonNull YourViewHolder holder, int i) {
...
holder.binding.setPosition(i);
}
时,您想要设置将触发data binding
的变量,以及选择填充每个项目的数据绑定方法。由于它是变量,而不是方法。
似乎在适配器中执行 @Override
public void onBindViewHolder(@NonNull YourViewHolder holder, int i) {
...
holder.binding.setPosition(i);
}
时,您想要设置将触发data binding
的变量,以及选择填充每个项目的数据绑定方法。由于它是变量,而不是方法。