在RecyclerView中的OnClick侦听器[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在RecyclerView中的OnClick侦听器[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
- RecyclerView onClick 40个答案
无法让我的OnClick监听器工作。我在另一个片段中创建了一个onClick侦听器,但该方法在此片段中不起作用。如果你看一下我的代码,我之前使用onclick监听器的方式是:
holder.alertItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
但它不会在下面的代码中工作。对于一些rease,alertItemView是红色的,我不知道为什么。我做的与我的其他代码完全相同,但这次它无法正常工作。关于为什么或者你有更好的方法的任何想法我可以设置一个onclick监听器来从每个位置获取信息?
public class AlertAdapter extends RecyclerView.Adapter<AlertAdapter.AlertViewHolder> {
private List<AlertReference> AlertItem;
public Context context;
public AlertAdapter(List<AlertReference> AlertItem, Context context) {
this.AlertItem = AlertItem;
this.context = context;
}
@NonNull
@Override
public AlertViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.alert_list_item, parent, false);
return new AlertViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final AlertViewHolder holder, final int position) {
final AlertReference alertItemHolder = AlertItem.get(position);
holder.text_AlertCoin.setText(alertItemHolder.getCoin_asset());
holder.text_AlertAmount.setText(alertItemHolder.getCoin_amount());
}
@Override
public int getItemCount() {
return AlertItem.size();
}
public class AlertViewHolder extends RecyclerView.ViewHolder {
public TextView text_AlertCoin;
public ImageView image_AlertCoin;
public AlertViewHolder(View alertItemView) {
super(alertItemView);
text_AlertCoin = (TextView)
alertItemView.findViewById(R.id.TV_CoinAsset);
alertItemView.findViewById(R.id.image_CoinAlert);
}
}
}
在你的qazxsw poi和setOnClickListener中创建一个qazxsw poi的引用,如下所示:
view
希望这可以帮助
使用一点DataBinding和一个自定义监听器非常简单。
这是你的新AlertViewHolderClass
:
public class AlertAdapter extends RecyclerView.Adapter<AlertAdapter.AlertViewHolder> {
private List<AlertReference> AlertItem;
public Context context;
public AlertAdapter(List<AlertReference> AlertItem, Context context) {
this.AlertItem = AlertItem;
this.context = context;
}
@NonNull
@Override
public AlertViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.alert_list_item, parent, false);
return new AlertViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final AlertViewHolder holder, final int position) {
final AlertReference alertItemHolder = AlertItem.get(position);
holder.text_AlertCoin.setText(alertItemHolder.getCoin_asset());
holder.text_AlertAmount.setText(alertItemHolder.getCoin_amount());
holder.alertItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
@Override
public int getItemCount() {
return AlertItem.size();
}
public class AlertViewHolder extends RecyclerView.ViewHolder {
public TextView text_AlertCoin;
public ImageView image_AlertCoin;
public View alertItemView;
public AlertViewHolder(View alertItemView) {
super(alertItemView);
this.alertItemView = alertItemView;
text_AlertCoin = (TextView)
alertItemView.findViewById(R.id.TV_CoinAsset);
alertItemView.findViewById(R.id.image_CoinAlert);
}
}
}
我不知道您的布局文件是什么样的,但它需要是这样的:
AlertAdapter
顶部的public class AlertAdapter extends RecyclerView.Adapter<AlertAdapter.AlertViewHolder> {
public Context context;
public AlertListener alertListener;
private ArrayList<AlertReference> alertItems;
public AlertAdapter(Context context, ArrayList<AlertReference> alertItems, AlertListener alertListener) {
this.alertItems = alertItems;
this.context = context;
}
@NonNull
@Override
public AlertViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new AlertViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.alert_list_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull final AlertViewHolder holder, final int position) {
final AlertReference alertItem = alertItems.get(position);
holder.binding.setAlertItem(alertItem);
holder.binding.setHandler(alertListener);
}
@Override
public int getItemCount() {
return AlertItem.size();
}
public class AlertViewHolder extends RecyclerView.ViewHolder {
public AlertBinding binding;
public AlertViewHolder(View alertItemView) {
super(alertItemView);
binding = DataBindingUtil.bind(alertItemView);
}
}
public interface AlertListener {
public void onAlertTapped(AlertReference reference);
}
}
标记在布局上启用DataBinding,在适配器的绑定布局上设置变量会自动设置布局中的值。这样,您可以直接从您已实例化AlertAdapter的Activity或Fragment将侦听器传递到布局。像这样:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data class="AlertBinding">
<variable
name="alertItem"
type="package.for.your.AlertReference" />
<variable
name="handler"
type="package.for.your.AlertListener" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{ (view) -> handler.onAlertItemClicked(alertItem) }">
<TextView
android:id="@+id/text_alert_coin"
android:text="@{ alertItem.getCoin_amount() }"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text_alert_amount"
android:text="@{ alertItem.getCoin_asset() }"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
此外,请确保通过将其添加到模块级build.gradle文件来启用DataBinding:
<layout>
请让我知道,如果你有任何问题!
编辑:有关DataBinding的更多信息 - AlertAdapter alertAdapter = new AlertAdapter(context, yourAlertItemsList, new AlertAdapter.AlertListener() {
@Override
public void onAlertItemClicked(AlertReference alertReference){
// Your alertReference code goes here
}
});
以上是关于在RecyclerView中的OnClick侦听器[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Android:RecyclerView onClick 监听器没有得到
如何在我的 recyclerview 中使用 cardview 设置 onclick 侦听器,并在单击 recyclerview 时从 firebase 数据库中检索数据?
recyclerview 中的 admob 插页式广告实施不起作用?