2015-12-14 4 views
2

Я пытаюсь добавить простую полосу прокрутки к моему RecyclerView. Я нашел два предложения о том, как это сделать, но не дал мне результатов. Эти предложения: setting the orientation of the LayoutManager to VERTICAL и/или adding the android:scrollbars="vertical" attribute to the RecyclerView. Первый метод не показывает полосу прокрутки, а второй сбой приложения, с NullPointerException:RecyclerView With Scroll Bar

12-14 16:39:09.392 31768-31768/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.example.app, PID: 31768 
     java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference 
      at android.support.v7.widget.RecyclerView.computeVerticalScrollRange(RecyclerView.java:1654) 
      at android.view.View.onDrawScrollBars(View.java:13924) 
      at android.view.View.onDrawForeground(View.java:17657) 
      at android.view.View.draw(View.java:16189) 
      at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3097) 
      at android.view.View.updateDisplayListIfDirty(View.java:15174) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.updateDisplayListIfDirty(View.java:15169) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.updateDisplayListIfDirty(View.java:15169) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.updateDisplayListIfDirty(View.java:15169) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.updateDisplayListIfDirty(View.java:15169) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.updateDisplayListIfDirty(View.java:15169) 
      at android.view.View.draw(View.java:15948) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
      at android.view.View.draw(View.java:16181) 
      at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 
      at android.view.View.updateDisplayListIfDirty(View.java:15174) 
      at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
      at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
      at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) 
      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
      at android.view.Choreographer.doFrame(Choreographer.java:606) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Это мой код для инициализации RecyclerView, который прекрасно работает до тех пор, пока я не атрибут android:scrollbars="vertical" , но не показывает полосу прокрутки:

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
layoutManager.setSmoothScrollbarEnabled(true); 

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler); 
recyclerView.setLayoutManager(layoutManager); 
recyclerView.setHasFixedSize(true); 
recyclerView.addItemDecoration(new DividerDecoration(this)); 
recyclerView.setAdapter(new MyAdapter(dataset)); 

Я что-то не так? Есть ли более простой способ получить полосы прокрутки для RecyclerView?


Это XML, только простой RecyclerView в FrameLayout:

<FrameLayout 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/recycler" 
      android:layout_width="match_parent" android:layout_height="match_parent"> 
      <!--android:scrollbars="vertical"--> 
</FrameLayout> 
+0

Можете ли вы поделиться xml? –

+0

@ inner_class7 Добавлено после перерыва – Bryan

ответ

3

Я нашел эту проблему, хотя до сих пор не результат я надеялся. Оказывается, это потому, что я инициализировал RecyclerView после onCreate(), поэтому в представлении контента пропустите RecyclerView, потому что адаптер не подключен. Затем, когда RecyclerView пытается позвонить LayoutManager.canScrollVertically(), из-за атрибута android:scrollbars="vertical", он получает NullPointerException, потому что нет LayoutManager прилагается.

Раствор для инициализации RecyclerView в onCreate() с нулевым Adapter, а затем поменять Adapter, когда я получаю данные. Что-то вроде этого:

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

    mRecycler = (RecyclerView) findViewById(R.id.recycler); 

    mRecycler.setLayoutManager(new LinearLayoutManager(this)); 
    mRecycler.setHasFixedSize(true); 
    mRecycler.addItemDecoration(new DividerDecoration(this)); 
    mRecycler.addAdapter(new MyAdapter(null)); 

    new MyTask(this).execute; 
} 

@Override 
protected void onPostExecute(ArrayList<Data> dataset) { 
    mRecycler.swapAdapter(new MyAdapter(dataset), false); 
} 

Это позволяет скроллбар набор с android:scrollbars="vertical", но я надеялся на постоянная скроллинг, что пользователь может взаимодействовать с, а не только визуальным индикатором.

+0

Спасибо - для меня это работает с просто установкой «setLayoutManager» в Create. Все остальное не нужно – Kibi