I have an activity extending AppCompatActivity with a single fragment which contains RecyclerView. On any item click, it will replace this fragment with another fragment which contains ViewPager and fragments of ViewPager are again RecyclerView.
RecyclerViewFragment
ViewPagerFragment
I am getting following error(app crashes) on ViewPager fragment while scrolling the page.
E/InputEventReceiver: Exception dispatching input event. E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizontally()' on a null object reference E/MessageQueue-JNI: at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2022) E/MessageQueue-JNI: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2059) E/MessageQueue-JNI: at android.view.ViewGroup.dispatchTransformedTouchEvent
.
.
.
E/AndroidRuntime: FATAL EXCEPTION: main E/AndroidRuntime: Process: me.twig.twigme, PID: 23451 E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizontally()' on a null object reference E/AndroidRuntime: at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2022) E/AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2059) E/AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432) E/AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
Below is the code RecyclerViewFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_cards, container, false);
}
@Override
public void onResume() {
super.onResume();
cardsRecyclerView = (RecyclerView) getActivity().findViewById(R.id.cards_recycler_view);
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
cardsRecyclerView.setLayoutManager(layoutManager);
if(cardsRecyclerView.getAdapter() == null)
{
cardAdapter = new CardAdapter(getActivity().getApplicationContext(), getActivity(), new ArrayList<CardModel>());
cardsRecyclerView.setAdapter(cardAdapter);
}
// List initialization code
}
public static RecyclerViewFragment createInstance(String cardsJson) {
RecyclerViewFragment cardsListFragment = new RecyclerViewFragment();
Bundle args = new Bundle();
args.putString("cardsJson", cardsJson);
cardsListFragment.setArguments(args);
return cardsListFragment;
}
ViewPagerFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_cards_pager, container, false);
}
@Override
public void onStart() {
super.onStart();
tabLayout = (TabLayout) getActivity().findViewById(R.id.tabLayout);
tabLayout.removeAllTabs();
viewPager = (ViewPager) getActivity().findViewById(R.id.viewPager);
pagerAdapter = new PagerAdapter(getChildFragmentManager());
for( i=0; i<3; i++)
{
pagerAdapter.addFragment(RecyclerViewFragment.createInstance(cardsJson), "Tab title");
}
viewPager.setAdapter(pagerAdapter);
tabLayout.setupWithViewPager(viewPager);
}
class PagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> fragmentList = new ArrayList<>();
private final List<String> fragmentTitleList = new ArrayList<>();
public PagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
fragmentList.clear();
fragmentTitleList.clear();
}
public void addFragment(Fragment fragment, String title) {
fragmentList.add(fragment);
fragmentTitleList.add(title);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentTitleList.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
fragment_cards.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_frame_layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/cards_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/ColorPrimaryLight"
android:clipToPadding="false"
xmlns:android="http://schemas.android.com/apk/res/android" />
</FrameLayout>
fragment_cards_pager.xml
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/ColorPrimaryLight">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextColor="@android:color/white"
app:tabSelectedTextColor="@android:color/white"
app:tabIndicatorColor="@android:color/white"
app:tabIndicatorHeight="6dp"/>
</android.support.design.widget.AppBarLayout>
<ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>