2015-08-21 3 views
0

У меня есть MainActivity с ViewPager. ViewPager состоит из двух Fragments, каждый из которых имеет один RecyclerView. Мне нужно иметь ссылку на RecyclerView для обновления/анимации и т. Д. В Fragment.Фрагмент onCreateView не сохраняет ссылку на элемент

Проблема возникает при вращении экрана, потому что по какой-то причине я не могу установить переменную-член обратно на 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 переменной. Однако, когда я позже попытаюсь получить к нему доступ, он равен нулю.

Я использую Otto для вызова метода FragmentonDataChanged(). Он вызывается, когда нажата кнопка в RecyclerView.

@Subscribe 
public void onDataChanged(DataChangedEvent event) { 
     List<CustomNotification> oldData = ((NotifRecyclerViewAdapter) mRecyclerView.getAdapter()).getmValues(); 
     List<CustomNotification> newData = getNotifications(); 
} 

mRecyclerView.getAdapter() null в этом обращении.

Fragment's getView() также возвращается null. Что происходит?

+2

Что значит «когда я пытаюсь получить к нему доступ»? – JanithaR

+0

Я отредактировал вопрос –

+1

Как вы уверены, что onDataChanged вызывается после onCreateView? –

ответ

0

Есть несколько вещей, которые я нашел здесь неправильно. Пожалуйста, не звоните setupRecyclerView(mRecyclerView); в ваш onCreateView(), это то, что должно быть вызвано на вашем activityCreated(), потому что до этого момента ваш фрагмент не мог быть прикреплен к вашей активности. Плюс я не люблю делать findViewByIds.

Используйте обратные вызовы onViewCreated() и onActivityCreated(). Итак, ваш код будет выглядеть примерно так.

@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(), которые не могли быть добавлен фрагмент. Сделайте там нулевую проверку.

Смежные вопросы