首页 文章

在onOptionsItemSelected中创建recyclelerview,而不在onCreate in activity中创建

提问于
浏览
1

我有一个在onCreate中找不到的recyclelerview,但是在onOptionsItemSelected中 . 原因如下:当我单击选项菜单中的某个项目时,我会显示一个底部工作表,请参阅:(google specslibrary) . 该库采用xml-layout,这是我的recyclerview所在的位置 . 问题是,当我将布局管理器附加到recyclerview时,我得到以下异常:

java.lang.NullPointerException:尝试在android.support.v7.widget.RecyclerView.computeVerticalScrollRange(RecyclerView . )上的空对象引用上调用虚拟方法'boolean android.support.v7.widget.RecyclerView $ LayoutManager.canScrollVertically()' . java:1545)在android.view.View.View.StallBars(View.java:12943)android.view.View.draw(View.java:15237)android.support.v7.widget.RecyclerView.draw(RecyclerView.java) :3037)在android.view.View.View.get.DisplayList(View.java:14189)的android.view.View.View.Stap(View.java:14189)安卓android.view. .view.ViewGroup.drawChild(ViewGroup.java:3405)位于android.view.View.View.View.View(View.java:15234)的android.view.View.Dis上的android.view.View.DavatchDraw(ViewGroup.java:3198) . update.DisplayListIfDirty(View.java:14167)位于android.view.View.View.Go(View.java:14189)的android.view.View.View.Start(View.java:14189)(View.java:14199) :3405)在android.view.ViewGrou p.dispatchDraw(ViewGroup.java:3198)位于android.view.View.View.draw的android.view.View.View.get.目录(View.java:14182)上的android.view.View.updateDisplayListIfDirty(View.java:14162) .java:14959)在android.view.ViewGroup.Dyser.drawChild(DrawerLayout.java:1089)的android.view.ViewGroup.DispoutDraw(ViewGroup . java:3198)在android.view.View.View.View.(View.java:14959)的android.view.View.get.DisplayList(View.java:14189)上的android.view.View.updateDisplayListIfDirty(View.java:14162) android.view.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View .getDisplayList(View.java:14189)位于android.view.View.St.(Lu(),View.java:14959),位于android.view.ViewGroup.DavatchDraw(ViewGroup)的android.view.ViewGroup.drawChild(ViewGroup.java:3405) . java:3198)在android.view.View.updateDisplayListIfDirty(View.java:1416) 2)在Android.view.View.View.(View.java:14959)上的android.view.View.View.(View.java:14959)安卓的android.view.View.View.::::?????????????????????在android.view.View.draw.draw的android.view.View.getDisplayList(View.java:14189)的android.view.View.updateDisplayListIfDirty(View.java:14162)上查看.ViewGroup.dispatchDraw(ViewGroup.java:3198) (View.java:14959)在Android.view.View.View.DavidDisplayListIfDirty(View.java)的android.view.ViewGroup.DispatchDraw(ViewGroup.java:3198)的android.view.ViewGroup.drawChild(ViewGroup.java:3405) 14162)在Android.view.View.View.Go(View.java:3405)上的android.view.View.View.draw(View.java:14959)的android.view.View.getDisplayList(View.java:14189) . 在android.view.View.draw(View.java:15234)的android.widget.FrameLayout.draw(FrameLayout.java:598)的com.android.internal.policy上查看.ViewGroup.dispatchDraw(ViewGroup.java:3198) .impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:2650)在android.view.View.updateDisplayListIfDirty( View.java:14167)在android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)的android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)的android.view.View.getDisplayList(View.java:14189) )在android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)的android.view.ViewRootImpl.draw(ViewRootImpl.java:2530)android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352)android.view .ViewRootImpl.performTraversals(ViewRootImpl.java:1982)位于android.view.ChoreIvers.exeTraversal(ViewRootImpl.java:1061)的android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5885),位于android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767)位于android.view.Choreographer(Page 4)上的android.view.doCallbacks(Choreographer.java:580),android.view.Choreographer $ FrameDisplayEventReceiver.run上的android.view.Choreographer.doFrame(Choreographer.java:550) (Choreo

所以我的问题是:除了onCreate of activity或者onCreateView of fragment之外,如何在其他任何东西中创建一个recyclerview?

任何帮助深表感谢 . 谢谢 .

下面是我创建recyclerview的过程:首先我实例化底部工作表 . 见下面的代码

private BottomSheetLayout bottomSheet;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ...

        bottomSheet = (BottomSheetLayout) findViewById(R.id.bottomsheet);
}

在onOptionsItemSelected中,我创建了recyclerview . 见下面的代码

List<BottomSheetData> mCategoryList = new ArrayList<>();

BottomSheetAdapter bottomAdapter = new BottomSheetAdapter(mCategoryList); //Recyclerview adapter

RecyclerView mRecyclerView = (RecyclerView) bottomSheet.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //error caused here 
mRecyclerView.setAdapter(bottomAdapter);

这是我的底页布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FAF9F7">

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@android:color/transparent"
        android:clipToPadding="false"
        android:scrollbars="vertical"
        />

</LinearLayout>

1 回答

  • 2
    //error caused here
    

    不是直接的 . 如果是,您会在堆栈跟踪中看到它 .

    现在,您的行号与the RecyclerView source codemaster 分支不匹配,因此首先要确保您使用的最新 recyclerview-v7 (22.2.1),如果你绊倒 RecyclerView bug .

    实际上,有is (or was) a bug with RecyclerView模仿你的堆栈跟踪,与你拥有 android:scrollbars 属性相关联 . 该错误与IDE呈现代码有关; this bugRecyclerView 本身有关 . 因此,如果在转到22.2.1时问题仍然存在,请尝试删除 android:scrollbars ,看看是否有帮助 . 请注意,如果在22.2.1中没有修复,我怀疑它是否会被修复,因为谷歌拒绝了第二个错误报告 .

相关问题