[英]How do I initialize a listener in a recycler adapter?
我需要能夠通過偵聽器將點擊的回收器項目的 position 發送到父片段,但每次點擊它時,它都會說偵聽器是 null。
java.lang.NullPointerException: Attempt to invoke interface method 'void com.eataway.partner.adapters.MenuAdapter$SectionAdapterListener.onSectionSend(int)' on a null object reference
at com.rest.partner.adapters.MenuAdapter.lambda$onBindViewHolder$0$MenuAdapter(MenuAdapter.java:82)
at com.rest.partner.adapters.-$$Lambda$MenuAdapter$TzEQ_dT_4Yb5iXO0LwjA0DjCNEI.onClick(Unknown Source:4)
這是相關的適配器代碼。 頂部是構造函數 class 后跟監聽器定義和設置。 然后在 onBindViewHolder 中,我觸發了該項目的點擊操作,即該項目的整個視圖都是可點擊的。 底部是相關viewHolder的內部class。
// Constructor class
public MenuAdapter(Context adapterContext, ArrayList<DishItem> restaurantDishItemArrayList) {
this.adapterContext = adapterContext;
this.restaurantDishItemArrayList = restaurantDishItemArrayList;
}
// Define listener to send chosen section
public interface SectionAdapterListener {
void onSectionSend(int position);
}
// Set the listener. Must be called from the fragment
public void setSectionAdapterListener(SectionAdapterListener sectionAdapterListener) {
this.sectionAdapterListener = sectionAdapterListener;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
if (adapterContext instanceof SectionAdapterListener) sectionAdapterListener = (SectionAdapterListener) adapterContext;
if (holder instanceof SectionViewHolder) {
((SectionViewHolder)holder).tvHeaderName.setText(restaurantDishItemArrayList.get(position).getHeaderName());
if (sectionAdapterListener == null ) Log.d(TAG, "listener is null");
((SectionViewHolder)holder).viewForeground.setOnClickListener(v -> sectionAdapterListener.onSectionSend(position));
} else if (holder instanceof DishViewHolder) {
((DishViewHolder)holder).tvMenuItemName.setText(restaurantDishItemArrayList.get(position).getMenuItemName());
((DishViewHolder)holder).tvMenuItemDescription.setText(restaurantDishItemArrayList.get(position).getMenuItemDescription());
}
}
public class SectionViewHolder extends RecyclerView.ViewHolder {
private TextView tvHeaderName;
private RelativeLayout viewForeground;
public SectionViewHolder(@NonNull View itemView) {
super(itemView);
tvHeaderName = itemView.findViewById(R.id.menu_header_name);
viewForeground = itemView.findViewById(R.id.foreground_view);
}
}
創建接口 class。 然后將接口添加到您的 RecyclerAdapter 構造函數。
YourInterface listener;
public MenuAdapter(YourInterface listener, Context adapterContext, ArrayList<DishItem> restaurantDishItemArrayList) {
this.listener = listener;
this.adapterContext = adapterContext;
this.restaurantDishItemArrayList = restaurantDishItemArrayList;
}
然后在你的活動中
MenuAdapter menuAdapter = new MenuAdapter(listener, context, arraylist);
為避免NullPointerException
在使用其方法之前檢查偵聽器是否為 null,因此如果sectionAdapterListener
為null
,請更改onBindViewHolder()
以返回
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
if (adapterContext instanceof SectionAdapterListener) sectionAdapterListener = (SectionAdapterListener) adapterContext;
if (holder instanceof SectionViewHolder) {
((SectionViewHolder)holder).tvHeaderName.setText(restaurantDishItemArrayList.get(position).getHeaderName());
if (sectionAdapterListener == null ) {
Log.d(TAG, "listener is null");
return;
}
((SectionViewHolder)holder).viewForeground.setOnClickListener(v -> sectionAdapterListener.onSectionSend(position));
} else if (holder instanceof DishViewHolder) {
((DishViewHolder)holder).tvMenuItemName.setText(restaurantDishItemArrayList.get(position).getMenuItemName());
((DishViewHolder)holder).tvMenuItemDescription.setText(restaurantDishItemArrayList.get(position).getMenuItemDescription());
}
}
否則,您需要從創建此適配器的活動/片段中調用setSectionAdapterListener()
您可以將以下代碼添加到適配器 class 的 onBindViewHolder 方法中。
holder.itemView.setonClickListener{
//add your code here....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.