首页 > 解决方案 > 视图寻呼机适配器中的回调更改为空对象

问题描述

在主片段中,我有 viewpager,所以我创建了 view pager 适配器:

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

现在在创建适配器后的主片段中,我以这种方式获得了 fragment1:

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

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

在调试模式下,第一个回调变量被初始化,但在 fragmet1 中,当我点击我的项目时,我有一个列表视图:

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

callback一片空白 !!!为什么回调是 null ?如果之前不是 null。

parkViewPagerAdapter.getItem(0) 返回一个新片段?

标签: androidandroid-viewpager

解决方案


是的,你的假设是正确的。parkViewPagerAdapter.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 的原因。


推荐阅读