Hi I'm having trouble using recyclerview with GridLayoutManager in Marshmallow. I use a fragment to make a list and here is the code
private RecyclerView mRecyclerView;
private RecyclerCategoryAdapter mListAdapter;
private GridLayoutManager mLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_category, container, false);
mSwipeLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_container);
mRecyclerView = (RecyclerView) v.findViewById(R.id.category_recyclerview);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new GridLayoutManager(container.getContext(), 2);
mRecyclerView.setLayoutManager(mLayoutManager);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if ( mListAdapter != null && mListAdapter.isPositionFooter(position) || mListAdapter.isPositionHeader(position)) {
return mLayoutManager.getSpanCount();
} else {
return 1;
}
}
});
mRecyclerView.setLayoutManager(mLayoutManager);
return v;
}
so in case there is header or footer in the list I tried to make the content to fill the width of the screen otherwise it should be 2 column grid layout. The app crashes on the first if statement right after the getSpanSize(int position) is called.
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.memebox.us.adapter.recycler.RecyclerCategoryAdapter.isPositionHeader(int)' on a null object reference
at com.memebox.us.fragment.CategoryFragment$1.getSpanSize(CategoryFragment.java:96)
at android.support.v7.widget.GridLayoutManager$SpanSizeLookup.getSpanGroupIndex(GridLayoutManager.java:804)
at android.support.v7.widget.GridLayoutManager.getSpanGroupIndex(GridLayoutManager.java:357)
at android.support.v7.widget.GridLayoutManager.getRowCountForAccessibility(GridLayoutManager.java:128)
at android.support.v7.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:7659)
at android.support.v7.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:7619)
at android.support.v7.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityNodeInfo(RecyclerViewAccessibilityDelegate.java:59)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompat.java:233)
at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompatJellyBean.java:61)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:6619)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:6580)
at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:23704)
at android.view.View.createAccessibilityNodeInfo(View.java:6563)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:145)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
at android.view.View.onInitializeAccessibilityEventInternal(View.java:6517)
at android.view.View$AccessibilityDelegate.onInitializeAccessibilityEvent(View.java:23616)
at android.support.v4.view.AccessibilityDelegateCompatIcs.onInitializeAccessibilityEvent(AccessibilityDelegateCompatIcs.java:92)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:179)
at android.support.v4.view.AccessibilityDelegateCompat.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:419)
at android.support.v7.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityEvent(RecyclerViewAccessibilityDelegate.java:65)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:228)
at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompatJellyBean.java:56)
at android.view.View.onInitializeAccessibilityEvent(View.java:6503)
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:6364)
at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:23555)
at android.support.v4.view.AccessibilityDelegateCompatIcs.sendAccessibilityEventUnchecked(AccessibilityDelegateCompatIcs.java:117)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:210)
at android.support.v4.view.AccessibilityDelegateCompat.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:358)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:255)
at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.sendAccessibilityEventUnchecked(AccessibilityDelegateCompatJellyBean.java:82)
at android.view.View.sendAccessibilityEventUnchecked(View.java:6347)
at android.support.v7.widget.RecyclerView.sendAccessibilityEventUnchecked(RecyclerView.java:2649)
at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:23741)
at android.view.View$SendViewStateChangedAccessibilityEvent.runOrPost(View.java:23774)
at android.view.View.notifyViewAccessibilityStateChangedIfNeeded(View.java:9367)
at android.view.View.onFocusChanged(View.java:6232)
at android.view.View.clearFocusInternal(View.java:6124)
at android.view.View.unFocus(View.java:6169)
at android.view.ViewGroup.unFocus(ViewGroup.java:1010)
at android.view.ViewGroup.unFocus(ViewGroup.java:1012)
at android.view.ViewGroup.unFocus(ViewGroup.java:1012)
at android.view.ViewGroup.unFocus(ViewGroup.java:1012)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:750)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:756)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:756)
at android.view.View.handleFocusGainInternal(View.java:5973)
at android.view.ViewGroup.handleFocusGainInternal(ViewGroup.java:730)
at android.view.View.requestFocusNoSearch(View.java:9053)
at android.view.View.requestFocus(View.java:9032)
at android.view.ViewGroup.requestFocus(ViewGroup.java:3048)
at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:3093)
at android.view.ViewGroup.requestFocus(ViewGroup.java:3049)
at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:3093)
at android.view.ViewGroup.requestFocus(ViewGroup.java:3049)
at android.view.View.requestFocus(View.java:8999)
at android.view.View.requestFocus(View.java:8978)
at android.support.v4.widget.DrawerLayout.dispatchOnDrawerOpened(DrawerLayout.java:750)
at android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:700)
at android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1833)
at android.support.v4.widget.ViewDragHelper.setDragState(ViewDragHelper.java:874)
at android.support.v4.widget.ViewDragHelper$2.run(ViewDragHelper.java:335)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
and here is the Adapter code I'm using
public boolean isPositionHeader(int position){
return position == 0;
}
public boolean isPositionFooter(int position){
return position == getItemCount() -1 ;
}
@Override
public int getItemCount() {
return mProductList != null ? mProductList.size() + 2 : 0;
}
I tried to always add two more items on the list as a header and a footer and always add both view on the list (as a full width content)
I wonder why "RecyclerCategoryAdapter.isPositionHeader(int)' on a null object reference" is in the message.
I checked null for the Adapter before calling the method "isPositionHeader(position)" and for the method isPositionHeader doesn't seem to have any possibility for null
It only happened on 6.0 and 6.1 version of Android phone. but never happens to my phone (my phone is nexus 5x). So it's not always happening
Since I just start replacing ListView to Recyclerview I need an advice. Can anybody help me solving this problem? or Is there anyone who is struggling with the same problem?
Plz ask me if there is more code I need to attach
Thank you
You have one small issue with your if statement. Change it to the following:
if (mListAdapter != null && (mListAdapter.isPositionFooter(position) || mListAdapter.isPositionHeader(position)))