不确定我的观察者模式有什么问题:
我已将界面定义为:
public interface OnBackFilterPressListener {
public ArrayList<FoodType> filterFoodType ();
}
当我按下后退按钮时,我希望激活聆听者 - 所有这些代码都在我的活动类中:
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackFilterPressListener.filterFoodType();
}
}
在我的适配器类中,我有以下代码:
public class RandomRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements SearchActivity.OnBackFilterPressListener {
@Override
public ArrayList<FoodType> filterFoodType() {
return foodTypes;
}
}
当我在活动中按下后退按钮时,我只想在我的活动类中返回适配器中的数据数组。
但是我收到了这个错误:
java.lang.NullPointerException:尝试调用接口方法 “的java.util.ArrayList com.example.simon..SearchActivity $ OnBackFilterPressListener.filterFoodType()” 在空对象引用上
foodType肯定存在 - 适配器将数据加载到活动中,我可以看到它在android模拟器上显示。单击后退按钮时出现此错误。
答案 0 :(得分:1)
我通过遵循这个主题并且有点创意来实现它:
How to create our own Listener interface in android?
我编写了一个自定义对象来阻止空对象引用以使用该接口,我首先要创建该对象:
public class BackFilterEvent implements Serializable {
private OnEventListener mOnEventListener;
public void setOnEventListener(OnEventListener listener) {
mOnEventListener = listener;
}
public ArrayList<FoodType> doEvent() {
if (mOnEventListener != null) {
return mOnEventListener.onEvent();
}
return null;
}
public interface OnEventListener {
ArrayList<FoodType> onEvent();
}
}
然后在我的Activity类中,我创建了对象:
BackFilterEvent backFilterEvent = new BackFilterEvent();
我尽可能地将其传递给我的代码。在我的例子中,我有一个活动,在片段中使用recyclerview适配器提供片段。我传递了这个对象,直到它到达recyclerview适配器。
将对象从Activity传递给Fragment:
FilterSearchFragment filterSearchFragment = new FilterSearchFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("listener", backFilterEvent);
filterSearchFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, filterSearchFragment)
.commit();
从Fragment传递到适配器:
Bundle bundle = getArguments();
BackFilterEvent backFilterEvent = (BackFilterEvent) bundle.getSerializable("listener");
RandomRecyclerViewAdapter randomRecyclerViewAdapter = new RandomRecyclerViewAdapter(getContext(), backFilterEvent);
在我的适配器构造函数中,我将其设置为在我从活动类调用它后执行工作:
this.backFilterEvent = backFilterEvent;
backFilterEvent.setOnEventListener(new BackFilterEvent.OnEventListener() {
@Override
public ArrayList<FoodType> onEvent() {
return foodTypes;
}
});
在我的activity类的后退按钮中,我调用了listener,它将触发适配器类中的工作:
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<FoodType> foodTypes = backFilterEvent.doEvent(); }