Android 碎片';s onCreateView不';不保存成员引用

Android 碎片';s onCreateView不';不保存成员引用,android,android-fragments,android-lifecycle,otto,Android,Android Fragments,Android Lifecycle,Otto,我有一个main活动,带有ViewPager。ViewPager由两个片段组成,每个片段都包含一个RecyclerView。我需要参考片段中的回收视图,以便对其进行更新/设置动画等 屏幕旋转时出现问题,因为出于某种原因,我无法将成员变量设置回RecyclerView public abstract class NotifListFragment extends Fragment { protected RecyclerView mRecyclerView; public No

我有一个
main活动
,带有
ViewPager
ViewPager
由两个
片段组成,每个片段都包含一个
RecyclerView
。我需要参考
片段中的
回收视图
,以便对其进行更新/设置动画等

屏幕旋转时出现问题,因为出于某种原因,我无法将成员变量设置回
RecyclerView

public abstract class NotifListFragment extends Fragment {

    protected RecyclerView mRecyclerView;

    public NotifListFragment() {
        // Required empty public constructor
        EventBusHelper.getBus().register(this);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mRecyclerView = (RecyclerView) inflater.inflate(R.layout.fragment_notif_list, container, false);
        setupRecyclerView(mRecyclerView);


        return mRecyclerView;
    }
因此,在这里的
onCreateView
中,我总是膨胀片段并将引用保存在
mRecyclerView
变量中。但是,当我稍后尝试访问它时,它是空的

我使用调用这两个
Fragment
onDataChanged()
方法。当按下
RecyclerView
中的按钮时,将调用该函数

@Subscribe
public void onDataChanged(DataChangedEvent event) {
        List<CustomNotification> oldData = ((NotifRecyclerViewAdapter) mRecyclerView.getAdapter()).getmValues();
        List<CustomNotification> newData = getNotifications();
}
@订阅
公共无效onDataChanged(DataChangedEvent事件){
List oldData=((NotifRecycleServiceAdapter)mRecyclerView.getAdapter()).getmValues();
List newData=getNotifications();
}
mRecyclerView.getAdapter()
在此调用中为空


片段的
getView()
也返回null。发生了什么事?

我在这里发现了一些错误。请不要调用
setupRecyclerView(mRecyclerView)
在您的
onCreateView()
中,这是应该在您的
activityCreated()
上调用的内容,因为在此之前您的片段可能尚未附加到您的活动。另外,我不喜欢在那里做
findviewbyds

使用和回调。 所以你的代码看起来像这样

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_notif_list, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecycler = (RecyclerView) view.findViewById(R.id.yourId);
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    setupRecyclerView(mRecycler);
}

在调用
onDataChanged()
的过程中,可能没有添加片段。在那里做一个空检查

我在这里发现了一些错误。请不要调用
setupRecyclerView(mRecyclerView)
在您的
onCreateView()
中,这是应该在您的
activityCreated()
上调用的内容,因为在此之前您的片段可能尚未附加到您的活动。另外,我不喜欢在那里做
findviewbyds

使用和回调。 所以你的代码看起来像这样

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_notif_list, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecycler = (RecyclerView) view.findViewById(R.id.yourId);
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    setupRecyclerView(mRecycler);
}

在调用
onDataChanged()
的过程中,可能没有添加片段。在那里做一个空检查

“当我以后尝试访问它时”是什么意思?我编辑了这个问题您如何确定onCreateView之后调用onDataChanged?每次调用onCreateView()时,我都会记录。我旋转屏幕,在日志中我可以看到onCreateView()被调用,并且mRecyclerView不为null。然后单击应用程序中的一个按钮。在这一点上,它崩溃了,mRecyclerView突然设置为null。好吧,我的错。当调用onDestroyView()时,我也应该取消注册,因为似乎每次旋转都会注册两个以上的片段来接收消息,以及旧的片段。而旧的没有任何布局,所以他们抛出错误。对不起,“当我稍后尝试访问它时”是什么意思?我编辑了这个问题您如何确定onDataChanged在onCreateView之后被调用?每次调用onCreateView()时,我都会记录。我旋转屏幕,在日志中我可以看到onCreateView()被调用,并且mRecyclerView不为null。然后单击应用程序中的一个按钮。在这一点上,它崩溃了,mRecyclerView突然设置为null。好吧,我的错。当调用onDestroyView()时,我也应该取消注册,因为似乎每次旋转都会注册两个以上的片段来接收消息,以及旧的片段。而旧的没有任何布局,所以他们抛出错误。很抱歉