Android 将对象从另一个片段传递到适配器时发生NullPointerException

Android 将对象从另一个片段传递到适配器时发生NullPointerException,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,我在尝试将自定义对象从片段传递到另一个片段时遇到问题,因此我可以检索数据并将其添加到我的Recyclerview中。 片段A: DarkSkyWeather fore = DarkSkyWeather.fromJson(response, i, timestamp, i); Forecast_Day_Fragment fdf = new Forecast_Day_Fragment(); fdf.addItemsRecyclerForecast(fore); 片段B: p

我在尝试将自定义对象从片段传递到另一个片段时遇到问题,因此我可以检索数据并将其添加到我的Recyclerview中。 片段A:

    DarkSkyWeather fore = DarkSkyWeather.fromJson(response, i, timestamp, i);
    Forecast_Day_Fragment fdf = new Forecast_Day_Fragment();
    fdf.addItemsRecyclerForecast(fore);
片段B:

public class Forecast_Day_Fragment extends Fragment{

private RecyclerView.LayoutManager mForecastLayoutManager;
private RecyclerView mForecastRecyclerView;
public ArrayList<Forecast_Daily_Item> mForecast_daily_items = new ArrayList<>();
public Adapter_Daily_Forecast mDayForecast;
private static final String TAG = "Forecast_Day_Fragment";

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.forecast_layout, container, false);

    mForecastRecyclerView = view.findViewById(R.id.fore_recycle);
    DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mForecastRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
    mForecastLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
    mDayForecast = new Adapter_Daily_Forecast(mForecast_daily_items);
    mForecastRecyclerView.setLayoutManager(mForecastLayoutManager);
    mForecastRecyclerView.addItemDecoration(dividerItemDecoration);
    mForecastRecyclerView.setAdapter(mDayForecast);

    return view;
}

public void addItemsRecyclerForecast(DarkSkyWeather skyWeather) {
   mForecast_daily_items.add(new Forecast_Daily_Item(R.drawable.sunny, skyWeather.getDailyTime(), skyWeather.getDailyTempLow(), skyWeather.getDailyTempHigh(), skyWeather.getDailySummary()));
    mDayForecast.notifyDataSetChanged(); //NullpointerException
}
我对android编程比较陌生,以前从未使用过片段。 谢谢你的帮助

编辑:

主要活动:

    public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, "onCreate: Started");

    mViewPager = findViewById(R.id.viewpager_main);
    setUpViewPager(mViewPager);

}

private void setUpViewPager(ViewPager viewPager) {
    SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
    adapter.addFragment(new WeatherController());
    adapter.addFragment(new Forecast_Day_Fragment());
    adapter.addFragment(new MapsActivity());
    viewPager.setAdapter(adapter);
}

}

在创建视图之前调用addItemsRecyclerForecast函数


因此,当调用addItemsRecyclerForecast时,onCreateView尚未被调用

根本原因:

Forecast_Day_Fragment fdf = new Forecast_Day_Fragment();
此时,fdf只是内存中的一个对象。所以片段的所有回调方法,比如onCreateonCreateView(在这个方法中,您可以初始化适配器)等等。。。我们还没有打电话。这就是下一行的原因

fdf.addItemsRecyclerForecast(fore);
此行尝试访问片段B中的适配器,但它尚未初始化

解决方案:将数据从FragmentA传递到MainActivity,然后MainActivity将数据转发到FragmentB。
您应该阅读本文,了解如何在viewpager中的片段之间传递数据。

plz显示将片段B添加到活动中的代码。这就是您的意思吗?是的,片段B在您的上下文中是指WeatherController吗?片段A是WeatherController。片段B是预测的\u Day\u片段是的,我是这么想的,但我用日志消息测试了它,并且在调用addItemsRecyclerForecast之前调用了CreateView…不,当您创建dfd instant时,这是片段B的另一个瞬间。崩溃发生在另一个瞬间。好的,谢谢,但是我如何在不创建新实例的情况下调用该方法呢?它成功了!非常感谢您抽出时间!很高兴听到这个消息。快乐编码!
fdf.addItemsRecyclerForecast(fore);