Not sure what's wrong with my observer pattern:
I have defined my interface as:
public interface OnBackFilterPressListener {
public ArrayList<FoodType> filterFoodType ();
}
When I press the back button, I want the listener to be activated - all this code is in my activity class:
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackFilterPressListener.filterFoodType();
}
}
In my adapter class, I have the following code:
public class RandomRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements SearchActivity.OnBackFilterPressListener {
@Override
public ArrayList<FoodType> filterFoodType() {
return foodTypes;
}
}
When I press the back button in my activity, I just want the array of data in my adapter to be returned in my activity class.
But I'm getting this error:
java.lang.NullPointerException: Attempt to invoke interface method 'java.util.ArrayList com.example.simon..SearchActivity$OnBackFilterPressListener.filterFoodType()' on a null object reference
foodType definitely exists - the adapter loads the data into activity and I can see it being displayed on the android emulator. I get this error when I click the back button.
I got it to work by following this thread and being a little creative:
How to create our own Listener interface in android?
I wrote a custom object to prevent the null object reference as to use the interface, I would first have to create the object:
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();
}
}
Then in my Activity class, I created the object:
BackFilterEvent backFilterEvent = new BackFilterEvent();
And I pass it as far as it needs to go in my code. In my case, I had an activity that feed a fragment with an recyclerview adapter within the fragment. I passed this object until it got to the recyclerview adapter.
Passing object from Activity to 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();
Passing from Fragment to Adapter:
Bundle bundle = getArguments();
BackFilterEvent backFilterEvent = (BackFilterEvent) bundle.getSerializable("listener");
RandomRecyclerViewAdapter randomRecyclerViewAdapter = new RandomRecyclerViewAdapter(getContext(), backFilterEvent);
In my adapter constructor, I set it to do the work once I call it from the activity class:
this.backFilterEvent = backFilterEvent;
backFilterEvent.setOnEventListener(new BackFilterEvent.OnEventListener() {
@Override
public ArrayList<FoodType> onEvent() {
return foodTypes;
}
});
And in my back button in my activity class, I call the listener, which will trigger the work in the adapter class:
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<FoodType> foodTypes = backFilterEvent.doEvent(); }
来源:https://stackoverflow.com/questions/33131836/interface-observer-pattern-null-object-reference