【问题标题】:RecyclerView Databinding Item clickRecyclerView 数据绑定项点击
【发布时间】:2018-01-15 18:58:10
【问题描述】:

我正在尝试从 Activity 本身(而不是适配器)监听我的回收站视图上的行点击(项目点击)。

到目前为止,我的适配器如下所示:

public class ListMiestnostiAdapter extends RecyclerView.Adapter<ListMiestnostiAdapter.ViewHolder>{
    private List<Miestnost> data;

    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewDataBinding binding;

        public ViewHolder(ViewDataBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        public void bind(Object obj){
            binding.setVariable(BR.obj, obj);
            binding.executePendingBindings();
        }
    }

    public ListMiestnostiAdapter(List<Miestnost> data) {
        this.data = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        ActivityListMiestnostiRowBinding itemBinding = ActivityListMiestnostiRowBinding.inflate(inflater, parent,false);

        return new ViewHolder(itemBinding);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Miestnost item = data.get(position);
        holder.bind(item);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }
}

我的行布局是这样的:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="obj"
            type="com.example.com.projectname.Models.Miestnost" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/selectableItemBackground"
        android:clickable="true"
        android:focusable="true"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/row_padding_vertical"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/row_padding_vertical">

        <TextView
            android:id="@+id/txt_miestnost_row_nazov"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="@{obj.Name}"
            android:textSize="16dp" />
    </LinearLayout>
</layout>

正如我已经提到的,我正在尝试收听项目点击,但不是来自适配器本身(如其他帖子所建议的那样),而是来自我持有此 RecyclerView 的 Activity。

这样的行为甚至可能吗?如果是,那么任何帮助将不胜感激,因为我在谷歌上找不到任何东西。

【问题讨论】:

    标签: android android-recyclerview android-adapter android-databinding


    【解决方案1】:

    您首先需要一个指定侦听器行为的接口。在此示例中,有一个名为 ContentItem 的示例模型,因此单击将返回该类型的项目:

    public interface OnItemClickListener {
        void onItemClick(ContentItem item);
    }
    

    构造函数将接收一个实现此接口的对象,以及要渲染的项目:

    private final List<ContentItem> items;
    private final OnItemClickListener listener;
    
    public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
        this.items = items;
        this.listener = listener;
    }
    

    您也可以创建一个 setOnItemClickListener 方法并以这种方式分配它。现在,在 onBindViewHolder 中,ViewHolder 将在自定义绑定方法中接收构造函数:

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(items.get(position), listener);
    }
    

    这就是这个绑定方法的样子:

    public void bind(final ContentItem item, final OnItemClickListener listener) {
        ...
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }
    

    通过创建一个新的适配器和侦听器来在您需要时使用它,以在单击项目时实现该行为。一个简单的例子:

    recycler.setAdapter(new ContentAdapter(
        items,
        new ContentAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(ContentItem item) {
                Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
            }
        }));
    

    Source

    【讨论】:

      【解决方案2】:

      要添加到João Alvares Neto 提供的答案,我们可以直接从布局中调用OnItemClickListener

      在变量标签中,我们可以传递OnItemClickListener并使用android:onClick属性调用它。

      <?xml version="1.0" encoding="utf-8"?>
      <layout xmlns:android="http://schemas.android.com/apk/res/android">
      
          <data>
              <variable
                  name="storyClickListener"
                  type="com.hoomanwe.zorro.ui.adapter.OnStoryClickListener" />
          </data>
      
          <androidx.constraintlayout.widget.ConstraintLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:onClick="@{() -> storyClickListener.onStoryClick(item.id)}" />
      </layout>
      

      这样就可以从João Alvares Neto提供的解决方案中去掉下面的代码

      public void bind(final ContentItem item, final OnItemClickListener listener) {
          itemView.setOnClickListener(new View.OnClickListener() {
              @Override public void onClick(View v) {
                  listener.onItemClick(item);
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2022-01-10
        • 2021-05-24
        相关资源
        最近更新 更多