簡體   English   中英

RecyclerView 數據綁定項點擊

[英]RecyclerView Databinding Item click

我正在嘗試從 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>

正如我已經提到的,我正在嘗試聽取項目點擊,但不是來自 Adapter 本身(正如其他帖子所建議的那樣),而是來自我的 Activity ,它包含這個 RecyclerView。

這樣的行動甚至可能嗎? 如果是,那么任何幫助將不勝感激,因為我在谷歌上找不到任何東西。

您首先需要一個指定偵聽器行為的接口。 在此示例中,有一個名為 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();
        }
    }));

來源

要添加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);
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM