【问题标题】:Implementation of GridView in android Fragmentandroid Fragment中GridView的实现
【发布时间】:2016-10-13 13:45:20
【问题描述】:

您好,我是 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(recFragment 案例 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.run(ViewPager.java:254) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 在 android.view.Choreographer.doCallbacks(Choreographer.java:670) 在 android.view.Choreographer.doFrame(Choreographer.java:603) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.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.Method.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 的方法是错误的?如果是这样,您对我如何在片段中创建正确的网格视图实现有什么建议吗?

【问题讨论】:

    标签: android android-studio android-fragments 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;
    

    【讨论】:

    • 您好,感谢您的回复。但这基本上是我的第一次尝试 :) 它并没有按预期工作。
    • 您的活动为空 请检查您拥有活动的片段中的 onActivityCreated 函数,但阿里建议的更好方法是 public void onAttach(Context context) { super.onAttach(context); this.context = 上下文;查看 rootView = inflater.inflate(R.layout.activity_rec,container,false); myGrid = (GridView)rootView.findViewById(R.id.recGrid); myGrid.setAdapter(new recAdapter(context, items)); myGrid.setOnItemClickListener(this); }
    • 看起来你真的在尝试做我已经尝试过的事情。但也许只有我不明白你的意思。
    • 我的代码好像有错字,Ali Taouni 提出的解决方案是有效的。谢谢!
    • 享受 ;) 为你高兴
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多