Android — Viewpager, адаптер получает нулевой объект

#android #android-fragments

#Android #android-фрагменты

Вопрос:

Родительская активность:

 public class FriendsActivity extends AppCompatActivity implements OnListChanged {

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setOffscreenPageLimit(4);
        viewPager.setAdapter(myCustomTabAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
        tabLayout.setupWithViewPager(viewPager);
 @Override
    public void onListChanged()
    {
  MyFragment fragment = (FriendsFragment) tabAdapter.getItem(flag-1);

         fragment.OnEventEditedAction(5, 5); // called
}
}
  

MyCustomTabAdapter:

  @Override
public Fragment getItem(int position)
{
   return MyFragment.NewInstance(position   1);
}
  

MyFragment:

 public class MyFragment extends Fragment implements OnEventEdited{

private OnListChanged onListChanged;
    private SwipeRefreshLayout _swipeRefreshLayout;

    @Override
    public void OnEventEditedAction(int flag, int action)
    {
**_swipeRefreshLayout.setRefreshing(true);** // null here
    }

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try
        {
            onListChanged = (FriendsActivity) context;
        }
        catch (ClassCastException e)
        {
        }
    }
 @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        // Setting swipeRefresh
        _swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
        _swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
            }
        });
}
  

У меня есть кнопка в моем фрагменте, затем, когда я нажимаю на кнопку, я вызываю интерфейс следующим образом.

 onListChanged.EventListChanged();
  

Затем событие вызывается в моей родительской активности:

 public void onFriendListChanged()
  

И это событие вызывает событие в моем фрагменте, но это swiperefresh равно нулю

Попытка вызвать виртуальный метод ‘void android.support.v4.widget.SwipeRefreshLayout.setRefreshing(логическое значение)’ для ссылки на нулевой объект

У меня есть вкладка из 4 фрагментов, фрагменты — это тот же «MyFragment», но с другим списком. Когда список в viewpager (3) изменился, мне нужно уведомить viewpager (1) и обновить список.

Ответ №1:

Возможны две проблемы: фрагмент, который я еще не прикрепил к действию при onListChanged() вызове, или getItem() метод не возвращает фактический фрагмент, поэтому вам необходимо создать его экземпляр.

Переопределите onAttachFragment() в своей активности и вызовите оттуда метод интерфейса:

 @Override
public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);
    ((FriendsFragment) tabAdapter.instantiateItem(viewPager, viewPager.getCurrentItem())).OnEventEditedAction(5, 5);
} 
  

Вместо viewPager.getCurrentItems() этого вы можете передать нужный вам индекс.

Ответ №2:

В жизненном цикле фрагмента onViewCreated() будет вызываться после onAttach() . Таким образом, есть вероятность, что _swipeRefreshLayout будет нулевым.

Возвращает onListChanged после инициализации _swipeRefreshLayout .

Поместите свой код в следующей последовательности с жизненным циклом фрагмента. Следует соблюдать приведенный ниже порядок. Поместите его в тот же вызов метода жизненного цикла, иначе поместите его в порядок последовательности.

     _swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
    _swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
        }
    });
    try
    {
        onListChanged = (FriendsActivity) context;
    }
    catch (ClassCastException e)
    {
    }