Реализация GridView в android Fragment

#android #android-studio #android-fragments #gridview

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

Вопрос:

Привет, я довольно новичок в разработке Android, и я борюсь с использованием фрагментов.

В моем fragmentPageAdapter у меня есть 4 случая:

 public Fragment getItem(int arg0) {
    // TODO Auto-generated method stub
    switch (arg0) {
        case 0:
            return new friFragment();
        case 1:
            return new freeFragment();
        case 2:
            return new mixedFragment();
        case 3:
            return new recFragment();
        default:
            break;
    }
    return null;
}
  

Я могу легко переходить от одного фрагмента к другому, если фрагменты НЕ содержат никакого кода. Тем не менее, я хочу реализовать GridView в одном из фрагментов (случай повторного фрагментирования 3). Моей первой попыткой было инициализировать адаптер в onCreateView

   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

getActivity().setContentView(R.layout.activity_rec);
myGrid = (GridView) getActivity().findViewById(R.id.recGrid);
myGrid.setAdapter(new recAdapter(getActivity().getApplicationContext(), items));
myGrid.setOnItemClickListener(this);

return  inflater.inflate(R.layout.activity_rec,container,false);
  

Это работает до такой степени, что я не получаю ошибок, НО случай 2 отображается только на полсекунды, после чего вместо этого он переходит к случаю 3, и на данный момент невозможно перемещаться между фрагментами.

Использование onAttach:

  public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
    myGrid = (GridView) getActivity().findViewById(R.id.recGrid);
    myGrid.setAdapter(new recAdapter(getActivity().getApplicationContext(), items));
    myGrid.setOnItemClickListener(this);
}
  

Выдает это фатальное исключение:

java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘void android.widget.GridView.setAdapter(android.widget.ListAdapter)’ для нулевой ссылки на объект в tryouts.demoapplication.recFragment.onAttach(recipesFragment.java:42) на android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java: 1019) на android.support.v4.app.BackStackRecord.ensureFragmentsAreInitialized(BackStackRecord.java: 1077) на android.support.v4.app.BackStackRecord.beginTransition(BackStackRecord.java: 1032) на android.support.v4.app.BackStackRecord.run(BackStackRecord.java: 658) на android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java: 1617) на android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) на android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) на android.support.v4.view.ViewPager.populate(ViewPager.java: 1177) на android.support.v4.view.ViewPager.populate(ViewPager.java: 1025) на android.support.v4.view.ViewPager $ 3.запустите (ViewPager.java: 254) в android.view.Хореограф $ CallbackRecord.run(Хореограф.java:858) в android.view.Хореограф.doCallbacks (хореограф.java: 670) в android.view.Хореограф.doFrame(Choreographer.java:603) в android.view.Хореограф $FrameDisplayEventReceiver.run(хореограф.java:844) на android.os.Handler.handleCallback(Handler.java:739) на android.os.Handler.DispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.java:148) на android.app.ActivityThread.main(ActivityThread.java:5417) в java.lang.reflect.Метод.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

После нескольких часов поиска в Google и stackoverflow я узнал, что проблема заключается в контексте. Я думал, что решением будет onAttach, но, как вы можете видеть, это мне не помогло. Если, конечно, я не неправильно понял, как использовать функцию onAttach, что вполне может быть так.

Итак, если я прав в отношении контекста, являющегося проблемой, как мне получить правильный контекст?

Или, возможно, мой подход к реализации gridview неверен? Если да, есть ли у вас какие-либо предложения о том, как я могу создать правильную реализацию gridview во фрагменте?

Ответ №1:

Может быть, это может вам помочь

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.activity_rec,container,false);
// dont forget to initialise the items list

myGrid = (GridView)rootView.findViewById(R.id.recGrid);
myGrid.setAdapter(new recAdapter(rootView.getActivity,items));
myGrid.setOnItemClickListener(this);

return  rootView;
  

Комментарии:

1. Привет, спасибо за ответ. Но это была в основном моя первая попытка 🙂 И это работает не так, как предполагалось.

2. ваша активность равна нулю, пожалуйста, проверьте наличие функции onActivityCreated во фрагменте, где у вас есть активность, но лучший способ — предложенный Ali public void onAttach(контекст context) { super.onAttach(context); this.context = context; Просмотр rootView = inflater.inflate(R.layout.activity_rec,контейнер,false); myGrid = (GridView)rootView.findViewById(R.id.recGrid); myGrid.setAdapter(новый recAdapter(контекст, элементы)); myGrid.setOnItemClickListener(this); }

3. Действительно кажется, что вы пытаетесь сделать то, что я уже пробовал. Но, может быть, только я не понимаю, что вы имеете в виду.

4. Кажется, у меня была опечатка в моем коде, решение, представленное Али Тауни, работает. Спасибо!

5. наслаждайтесь 😉 рад за вас