我试图在我的一个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>
答案 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
,而RecyclerView
标记位于 fragment_home.xml
尝试初始化片段中的RecyclerView
或者在 activity_home.xml
RecyclerView
标记