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。
这样的行为可能吗?如果是,那么任何帮助将不胜感激,因为我在 google.
上找不到任何内容
您首先需要一个指定侦听器行为的接口。在此示例中,有一个名为 ContentItem 的示例模型,因此单击将 return 一个该类型的项目:
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();
}
}));
要添加 提供的答案,我们可以直接从布局中调用 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>
通过这种方式,可以从
提供的解决方案中去掉下面的代码
public void bind(final ContentItem item, final OnItemClickListener listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}
我正在尝试从 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。
这样的行为可能吗?如果是,那么任何帮助将不胜感激,因为我在 google.
上找不到任何内容您首先需要一个指定侦听器行为的接口。在此示例中,有一个名为 ContentItem 的示例模型,因此单击将 return 一个该类型的项目:
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();
}
}));
要添加 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>
通过这种方式,可以从
public void bind(final ContentItem item, final OnItemClickListener listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}