如何使用数据绑定在RecyclerView中添加onClickListener

问题描述 投票:0回答:2

我刚刚开始使用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()返回-1NO_POSITION

我在这里想念什么?在NO_POSITION中实现databinding onClickListener的最佳方法是什么?

我已经有一些有效的方法,但不是RecyclerView方法。

android android-recyclerview fragment onclicklistener
2个回答
0
投票

这不起作用,因为您在视图创建时分配了变量。目前,您的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的变量,以及选择填充每个项目的数据绑定方法。由于它是变量,而不是方法。


0
投票

似乎在适配器中执行 @Override public void onBindViewHolder(@NonNull YourViewHolder holder, int i) { ... holder.binding.setPosition(i); } 时,您想要设置将触发data binding的变量,以及选择填充每个项目的数据绑定方法。由于它是变量,而不是方法。

© www.soinside.com 2019 - 2024. All rights reserved.