Search code examples
androidandroid-viewpager

Callback in view pager adapter change to null object


In main fragment i have viewpager so i created view pager adapter :

public class ParkingViewPagerAdapter extends FragmentPagerAdapter {

    private String cookie;
    private final String taskInfoString;

    public ParkingViewPagerAdapter(FragmentManager fm,String cookie, String taskInfoString) {
        super(fm);
        this.cookie = cookie;
        this.taskInfoString = taskInfoString;
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
            case 0:
                return Fragment1.newInstance(cookie,taskInfoString);
            case 1:
                return Fragment2.newInstance(cookie,taskInfoString);
        }
        return null;
    }

In fragment1 i created a callback and made a setter for initialize callback:

public interface Callback{
    void onRowClicked(Object item);
}

public void setCallback(Callback callback) {
    this.callback = callback;
}

Now in main fragment after created adapter i got fragment1 in this way:

Fragment1 fragment1 =
        (Fragment1) parkingViewPagerAdapter.getItem(0);

fragment1.setCallback(item -> {
    Log.i("", "loggggg: ");
});

In debug mode first callback variable is initialized but in fragmet1 i have a list view when i clicked on my item :

listAdapter.setListener(item ->{
                callback.onRowClicked(item);
}}

callback is null !!! Why callback is null ?If it was not null before.

parkingViewPagerAdapter.getItem(0) return a new fragment?


Solution

  • Yes, your assumption is correct. parkingViewPagerAdapter.getItem(0) returns a new fragment. As far as I can see at

        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:
                    return Fragment1.newInstance(cookie,taskInfoString);
                case 1:
                    return Fragment2.newInstance(cookie,taskInfoString);
            }
            return null;
        }
    

    you return a new instance every time when you invoke getItem method. So even if you add a callback by using setter, every time when you change your page in viewpager, a new instance of fragment will be created. So, that's why you're getting NPE.