Interface observer pattern: null object reference

◇◆丶佛笑我妖孽 提交于 2019-12-09 03:05:29
Simon

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(); }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!