NullPointerException,在null对象上设置适配器

时间:2015-09-26 04:02:25

标签: android android-recyclerview

我试图在我的一个ViewPagers片段中使用RecyclerView来获取交错网格布局。当我启动应用程序时,它会立即崩溃并抛出此错误:

  

引起:java.lang.NullPointerException:尝试调用虚拟   方法'无效   android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView $适配器)'   在null对象引用上               at xxx.HomeActivity.onCreate(HomeActivity.java:39)               在android.app.Activity.performCreate(Activity.java:5990)               在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)               在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)

我的第一个想法是,这可能是由加载视图的顺序引起的,但我不确定。我有一个ViewPager有2个片段。我在第一个片段xml中声明了RecyclerView,如下所示:

RES /布局/ fragment_home.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/home_grid"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

以下是我的活动的相关部分:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    ButterKnife.bind(this);

    setupToolbar();
    setupTabs();

    HomeGridAdapter adapter = new HomeGridAdapter(Contacts.createFakeContacts(20));

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.home_grid);

    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));


}

这是Java文件的第一个片段:

public class HomeFragment extends Fragment {

public static final String ARG_PAGE = "ARG_PAGE";

private int mPage;

public static HomeFragment newInstance(int page) {
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, page);
    HomeFragment fragment = new HomeFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPage = getArguments().getInt(ARG_PAGE);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_home, container, false);
}


}

我不认为我需要发布RecyclerViews适配器代码,因为我不认为这是问题的一部分,但如果它需要我可以。

对此问题的任何意见表示赞赏!

编辑:根据要求,继承我的活动xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".HomeActivity">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:minHeight="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="75dp"
    style="@style/ToolbarStyle"
    >

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:tabMode="scrollable"/>

</android.support.v7.widget.Toolbar>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>

</LinearLayout>

3 个答案:

答案 0 :(得分:1)

您正在活动中加载activity_home

setContentView(R.layout.activity_home);

,你的home_grid位于first_fragment

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

<android.support.v7.widget.RecyclerView
    android:id="@+id/home_grid"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</RelativeLayout>

答案 1 :(得分:1)

在您的活动的onCreate()内,首先找到您的ViewPager

    ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
    MyFragmentPagerAdaptor adaptor = new
        MyFragmentPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(adaptor);

在活动类中,创建一个名为FragmentPagerAdapter的新MyFragmentPagerAdapter嵌套类,它会在getItem()方法上返回您的片段。

目前,您的ViewPager内部没有任何内容,您也没有将片段加载到ViewPager。 (纯粹来自我看到的代码。我可能错了)

既然你的ViewPager里面有片段内容,你需要一种方法来访问片段中的子视图(在Viewpager内)。

这不可能直接实现,因此您需要使用适配器的getItem()方法创建要查找的片段的实例:

Fragment f = (Fragment) adaptor.getItem(pager.getCurrentItem());

虽然getCurrentItem()可以替换为直接指向片段的索引,但应该已经在getItem()中定义了。

最后,您可以在片段中找到您的子视图,如下所示:

RecyclerView theViewINeed = (RecyclerView)f.getView().findViewById(R.id.home_grid);

编辑:似乎在父级活动OnCreateView()期间未调用片段OnCreate()

尝试将以下代码移至OnStart。 (将您从onCreate()获得的片段参考作为字段,并在onStart()期间访问它)

RecyclerView theViewINeed = (RecyclerView)f.getView().findViewById(R.id.home_grid);

答案 2 :(得分:-1)

您已为Activity

指定了 activity_home.xml 布局

,而RecyclerView标记位于 fragment_home.xml

尝试初始化片段中的RecyclerView 或者在 activity_home.xml

中添加RecyclerView标记