#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. наслаждайтесь 😉 рад за вас