1

您好我在使用回收站的方式在Marshmallow中使用GridLayoutManager时遇到了问题。我用的片段,使列表,并在这里是在情况下,代码在Marshmallow中使用GridLayoutManager的Android回收站时遇到问题

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; 
} 

所以有页眉或页脚在我试图使内容以填充屏幕的宽度列表否则它应该是2列网格布局。在调用getSpanSize(int position)之后,应用程序在第一个if语句中崩溃。

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) 

这里是适配器代码我使用

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; 
} 

我想总是在名单上增加两个项目作为标题和页脚,总是在名单上添加这两个视图(作为全宽度内容)

我想知道为什么“在空对象引用上的RecyclerCategoryAdapter.isPositionHeader(int)'在消息中。

我检查空的适配器调用方法“isPositionHeader(位置)”之前和似乎isPositionHeader没有对空

它只发生在6.0和6.1版本的Android手机的任何可能性的方法。但从未发生过我的手机(我的手机是Nexus 5x)。所以它不总是发生

因为我刚开始将ListView替换为Recyclerview我需要一个建议。 有人可以帮我解决这个问题吗?或者有没有人在同一个问题上挣扎?

PLZ问我,如果有更多的代码,我需要附加

谢谢

回答

1

你有一个小问题,你的if语句。将其更改为以下内容:

if (mListAdapter != null && (mListAdapter.isPositionFooter(position) || mListAdapter.isPositionHeader(position))) 
+0

谢谢,我会尝试将它应用于下一个版本。但据我所知,java从左到右检查语句,并且在某些条件失败后不检查下一条语句。我不知道正确的事实吗? –

+0

是的,但它与'if((mListAdapter!= null && mListAdapter.IsPositionFooter(position))|| mListAdapter.IsPositionHeader(position))'等价。如你所见,即使'mListAdapter = null',它也会检查位置是否为头。如果他们都是'&&',那么它会像你原先想的那样行事。 – dharms