我需要能够通过侦听器将窃听的回收器项目的位置发送到父片段,但是每次我点击它时,它都说侦听器为空。
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)
这里是相关的适配器代码。顶部是构造函数类,后跟侦听器定义和设置。然后在onBindViewHolder中触发该项目的点击动作,即该项目的整个视图都是可点击的。底部是相关viewHolder的内部类。
// 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);
}
}
创建接口类。然后将接口添加到您的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,因此,如果onBindViewHolder()
为sectionAdapterListener
,则将null
更改为返回值>
@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()