Обратный вызов в представлении переходника пейджера в нулевой объект - PullRequest
0 голосов
/ 25 февраля 2019

В основном фрагменте у меня есть viewpager, поэтому я создал адаптер просмотра пейджеров:

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;
    }

Во фрагменте 1 я создал обратный вызов и установил установщик для обратного вызова инициализации:

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

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

Сейчас восновной фрагмент после созданного адаптера я получил фрагмент1 следующим образом:

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

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

В режиме отладки инициализируется первая переменная обратного вызова, но в fragmet1 у меня появляется представление списка, когда я нажимаю на свой элемент:

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

callback равно нулю !!!Почему обратный вызов равен нулю? Если раньше он не был нулевым.

parkingViewPagerAdapter.getItem (0) возвращает новый фрагмент?

1 Ответ

0 голосов
/ 25 февраля 2019

Да, ваше предположение верно.parkingViewPagerAdapter.getItem (0) возвращает новый фрагмент.Насколько я вижу на

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

, вы возвращаете новый экземпляр каждый раз, когда вызываете метод getItem.Таким образом, даже если вы добавите обратный вызов с помощью setter, каждый раз, когда вы изменяете свою страницу в viewpager, будет создаваться новый экземпляр фрагмента.Итак, вот почему вы получаете NPE.

...