【问题标题】:RecyclerView + ViewPager NullPointerException on 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizontally()'RecyclerView + ViewPager NullPointerException on 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizo​​ntally()'
【发布时间】:2016-01-11 14:31:04
【问题描述】:

我有一个扩展 AppCompatActivity 的活动,其中包含一个包含 RecyclerView 的片段。在任何项目点击时,它将用另一个包含 ViewPager 的片段替换这个片段,而 ViewPager 的片段又是 RecyclerView。

RecyclerViewFragment
ViewPagerFragment

我在滚动页面时在 ViewPager 片段上收到以下错误(应用程序崩溃)。

E/InputEventReceiver:异常调度输入事件。 E/MessageQueue-JNI:MessageQueue 回调中的异常:handleReceiveCallback E/MessageQueue-JNI:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizo​​ntally()” E/MessageQueue-JNI:在 android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2022) E/MessageQueue-JNI:在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2059) E/MessageQueue-JNI:在 android.view.ViewGroup.dispatchTransformedTouchEvent
.
.
.
E/AndroidRuntime: 致命异常: main E/AndroidRuntime:进程:me.twig.twigme,PID:23451 E/AndroidRuntime:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizo​​ntally()” E/AndroidRuntime:在 android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2022) E/AndroidRuntime:在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2059) E/AndroidRuntime:在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432) E/AndroidRuntime:在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)

下面是代码 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>

【问题讨论】:

  • 我也坚持这个:(如果你找到任何答案,请更新帖子..!!

标签: android nullpointerexception android-viewpager


【解决方案1】:

基本上,当LayoutManager 未在RecyclerView 上设置时,就会出现给定的异常。

我认为您的问题在于以下几行:

for( i=0; i<3; i++)
{
   pagerAdapter.addFragment(RecyclerViewFragment.createInstance(cardsJson), "Tab title");
}

在所有三个相邻视图中使用相同的片段会导致滑动错误,因为ViewPager 会保持相邻视图状态以进行滑动行为。众所周知,使用相同的 ID 也会导致类似的问题。尝试通过渲染不同的片段进行检查。

此外,在所有选项卡中显示相同的 fragment 看起来不合逻辑。

【讨论】:

    【解决方案2】:

    来自aga's answer

    当没有为 LayoutManager 提供 回收站视图。你可以这样做:

    final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    

    此解决方案以编程方式完成,但这意味着您没有在 RecyclerView 中声明任何 LayoutManager。

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      相关资源
      最近更新 更多