我有一个在onCreate中找不到的recyclelerview,但是在onOptionsItemSelected中 . 原因如下:当我单击选项菜单中的某个项目时,我会显示一个底部工作表,请参阅:(google specs和library) . 该库采用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 回答
不是直接的 . 如果是,您会在堆栈跟踪中看到它 .
现在,您的行号与the RecyclerView source code的
master
分支不匹配,因此首先要确保您使用的最新recyclerview-v7
(22.2.1),如果你绊倒RecyclerView
bug .实际上,有is (or was) a bug with RecyclerView模仿你的堆栈跟踪,与你拥有
android:scrollbars
属性相关联 . 该错误与IDE呈现代码有关; this bug与RecyclerView
本身有关 . 因此,如果在转到22.2.1时问题仍然存在,请尝试删除android:scrollbars
,看看是否有帮助 . 请注意,如果在22.2.1中没有修复,我怀疑它是否会被修复,因为谷歌拒绝了第二个错误报告 .