2016-06-09 175 views
2

我面對這個錯誤在我的應用程序:NullPointerException異常到RecyclerView.setLayoutManager方法

java.lang.NullPointerException: Attempt to read from field 'android.support.v7.widget.RecyclerView$Recycler android.support.v7.widget.RecyclerView.mRecycler' on a null object reference 

下面我發佈的logcat消息:

06-06 11:21:50.459 3701-3701/com.status.plug E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.status.plug, PID: 3701 
java.lang.NullPointerException: Attempt to read from field 'android.support.v7.widget.RecyclerView$Recycler android.support.v7.widget.RecyclerView.mRecycler' on a null object reference 
at android.support.v7.widget.RecyclerView$LayoutManager.onInitializeAccessibilityNodeInfo(RecyclerView.java:8233) 
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:6082) 
at android.view.View.createAccessibilityNodeInfoInternal(View.java:6043) 
at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:22287) 
at android.view.View.createAccessibilityNodeInfo(View.java:6026) 
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:5980) 
at android.view.View$AccessibilityDelegate.onInitializeAccessibilityEvent(View.java:22199) 
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:5966) 
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5833) 
at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:22138) 
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:5816) 
at android.support.v7.widget.RecyclerView.sendAccessibilityEventUnchecked(RecyclerView.java:2803) 
at android.view.View.sendAccessibilityEventInternal(View.java:5795) 
at android.view.View$AccessibilityDelegate.sendAccessibilityEvent(View.java:22096) 
at android.support.v4.view.AccessibilityDelegateCompatIcs.sendAccessibilityEvent(AccessibilityDelegateCompatIcs.java:112) 
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.sendAccessibilityEvent(AccessibilityDelegateCompat.java:204) 
at android.support.v4.view.AccessibilityDelegateCompat.sendAccessibilityEvent(AccessibilityDelegateCompat.java:336) 
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDeleg 

和呼叫的源代碼以RecyclerView 。

private void setLayout() { 
    mSwipeRefreshLayout = (SwipeRefreshLayout)mRootView.findViewById(R.id.id_fragment_headlines_pager__swipe_refresh_layout); 
    mRecyclerView = (RecyclerView)mRootView.findViewById(R.id.id_fragment_headlines_pager__recycler_view); 
    mEmptyTextView = (TextView)mRootView.findViewById(R.id.id_fragment_headlines_pager__empty_text_view); 
    Typeface fontType = Typeface.createFromAsset(getActivity().getAssets(), Globals.FONT_TYPE); 
    mEmptyTextView.setTypeface(fontType); 
} 

private void setRecyclerView(CustomProgressDialog progressDialog) { 
    setSwipeLayout(); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(mActivity); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    // FIXME: Crashes always happening the line below. 
    mRecyclerView.setLayoutManager(layoutManager); 
    mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

    Integer pageNumber = getArguments().getInt(ARG_PAGE); 
    List<Interest> interestsList = ContentManager.getInstance().getLoggedUser().getInterests(); 
    Integer categoryId = interestsList.get(pageNumber).getId(); 

    mAdapter = new HeadlineAdapter(mActivity, mFragment, categoryId, null, mHeadlineList); 
    mRecyclerView.setAdapter(mAdapter); 

    Integer position = ContentManager.getInstance().getHeadlinePosition(); 
    mRecyclerView.scrollToPosition(position); 
    ContentManager.getInstance().setHeadlinePosition(0); 

    saveLayoutInstances(); 
    progressDialog.cancel(); 
} 

和XML佈局。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.v4.widget.SwipeRefreshLayout 
      android:id="@+id/id_fragment_headlines_pager__swipe_refresh_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/id_fragment_headlines_pager__recycler_view" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
     </android.support.v4.widget.SwipeRefreshLayout> 

     <TextView 
      android:id="@+id/id_fragment_headlines_pager__empty_text_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/white" 
      android:gravity="center" 
      android:padding="10dp" 
      android:text="@string/headlines_fragment__empty_list" 
      android:textColor="@color/grey_700" 
      android:textSize="@dimen/text_size_normal" 
      android:visibility="gone" /> 
    </LinearLayout> 
</FrameLayout> 

這裏就是我稱爲 「的setLayout()」 的類的源代碼。

public class HeadlinesPagerFragment extends BaseFragment { 

//-------------------------------------------------- 
// Constants 
//-------------------------------------------------- 

private static final String ARG_PAGE = "page"; 
public static final Integer DELAY = 2000; 

//-------------------------------------------------- 
// Attributes 
//-------------------------------------------------- 

/** 
* Context. 
*/ 

private Activity mActivity; 
private Fragment mFragment; 

/** 
* Recycler view. 
*/ 

private ViewGroup mRootView; 
private SwipeRefreshLayout mSwipeRefreshLayout; 
private RecyclerView mRecyclerView; 
private HeadlineAdapter mAdapter; 
private List<Headline> mHeadlineList = null; 

/** 
* Others. 
*/ 

private TextView mEmptyTextView; 
private Dialog mBottomDialog = null; 
private Handler mHandler = new Handler(); 

//-------------------------------------------------- 
// Fragment Life Cycle 
//-------------------------------------------------- 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.onCreateView()."); 
    mActivity = getActivity(); 
    mFragment = this; 

    Integer number = getArguments().getInt(ARG_PAGE); 
    String color = ContentManager.getInstance().getLoggedUser().getInterests().get(number).getColor(); 
    ContentManager.getInstance().setCurrentThemeColor(color); 
    ContentManager.getInstance().setPageNumber(number); 

    mRootView = (ViewGroup)inflater.inflate(R.layout.fragment_headlines_pager, container, false); 
    setHasOptionsMenu(true); 
    setLayout(); 
    return mRootView; 
} 

/* 
@Override 
public void onPause() { 
    super.onPause(); 
    if (mAdapter != null) { 
     mAdapter.stopAudioOnResume(); 
    } 
} 
*/ 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.onResume() -> At onResume()."); 

    // Closes dialog. 
    if (mBottomDialog != null) { 
     mBottomDialog.dismiss(); 
    } 

    // Updates Headline list. 
    updateHeadlineList(); 
} 

//-------------------------------------------------- 
// Menu 
//-------------------------------------------------- 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    menu.getItem(0).setVisible(true); 
    menu.getItem(1).setVisible(true); 
    menu.getItem(2).setVisible(false); 
} 

//-------------------------------------------------- 
// Layout Methods 
//-------------------------------------------------- 

private void setLayout() { 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.setLayout()."); 

    // Sets the layout. 
    mSwipeRefreshLayout = (SwipeRefreshLayout)mRootView.findViewById(R.id.id_fragment_headlines_pager__swipe_refresh_layout); 
    mRecyclerView = (RecyclerView)mRootView.findViewById(R.id.id_fragment_headlines_pager__recycler_view); 
    mEmptyTextView = (TextView)mRootView.findViewById(R.id.id_fragment_headlines_pager__empty_text_view); 
    Typeface fontType = Typeface.createFromAsset(getActivity().getAssets(), Globals.FONT_TYPE); 
    mEmptyTextView.setTypeface(fontType); 
} 

private void setSwipeLayout() { 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.setSwipeLayout()."); 
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      mHandler.postDelayed(mHandlerChecker, DELAY); 
     } 
    }); 
    mSwipeRefreshLayout.setColorSchemeResources(R.color.blue_500, R.color.light_green_500, 
      R.color.orange_500, R.color.red_500); 
} 

private void setRecyclerView(CustomProgressDialog progressDialog) { 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.setRecyclerView()."); 
    setSwipeLayout(); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(mActivity); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    // FIXME: Crashes always happening the line below. 
    mRecyclerView.setLayoutManager(layoutManager); 
    mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

    Integer pageNumber = getArguments().getInt(ARG_PAGE); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.setRecyclerView() -> Page number is " + pageNumber + "."); 
    List<Interest> interestsList = ContentManager.getInstance().getLoggedUser().getInterests(); 
    Integer categoryId = interestsList.get(pageNumber).getId(); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.setRecyclerView() -> Interest id is " + categoryId + "."); 

    mAdapter = new HeadlineAdapter(mActivity, mFragment, categoryId, null, mHeadlineList); 
    mRecyclerView.setAdapter(mAdapter); 

    Integer position = ContentManager.getInstance().getHeadlinePosition(); 
    mRecyclerView.scrollToPosition(position); 
    ContentManager.getInstance().setHeadlinePosition(0); 

    saveLayoutInstances(); 
    progressDialog.cancel(); 
} 

//-------------------------------------------------- 
// Headline Methods 
//-------------------------------------------------- 

private void saveLayoutInstances() { 
    if (mSwipeRefreshLayout != null) { 
     ContentManager.getInstance().setSwipeRefreshLayout(mSwipeRefreshLayout); 
    } 

    if (mRecyclerView != null) { 
     ContentManager.getInstance().setRecyclerView(mRecyclerView); 
    } 

    if (mAdapter != null) { 
     ContentManager.getInstance().setHeadlineAdapter(mAdapter); 
    } 

    if (mEmptyTextView != null) { 
     ContentManager.getInstance().setEmptyTextView(mEmptyTextView); 
    } 

    if (mActivity != null) { 
     ContentManager.getInstance().setActivity(mActivity); 
    } 

    if (mFragment != null) { 
     ContentManager.getInstance().setFragment(mFragment); 
    } 
} 

private void getLayoutInstances() { 
    if (mSwipeRefreshLayout == null) { 
     mSwipeRefreshLayout = ContentManager.getInstance().getSwipeRefreshLayout(); 
    } 

    if (mRecyclerView == null) { 
     mRecyclerView = ContentManager.getInstance().getRecyclerView(); 
    } 

    if (mAdapter == null) { 
     mAdapter = ContentManager.getInstance().getHeadlineAdapter(); 
    } 

    if (mEmptyTextView == null) { 
     mEmptyTextView = ContentManager.getInstance().getEmptyTextView(); 
    } 

    if (mActivity == null) { 
     mActivity = ContentManager.getInstance().getActivity(); 
    } 

    if (mFragment == null) { 
     mFragment = ContentManager.getInstance().getFragment(); 
    } 
} 

private void updateHeadlineList() { 
    // Variables. 
    Integer pageNumber = getArguments().getInt(ARG_PAGE); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.updateHeadlinesList() -> Page number is " + pageNumber + "."); 
    Integer categoryId = ContentManager.getInstance().getLoggedUser().getInterests().get(pageNumber).getId(); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.updateHeadlinesList() -> Category id is " + categoryId + "."); 

    // Retrofit. 
    String pagination = "10,0"; 
    String sort = "desc"; 
    String filter; 
    if (categoryId == 0) { 
     filter = "popularity:+popular"; 
    } else { 
     // Check filters. 
     Boolean followFilter = ContentManager.getInstance().getFollowFilter(); 
     String append = ""; 
     if (followFilter) { 
      append = "|following:true"; 
     } 

     // Check place filter. 
     String placeFilter = ContentManager.getInstance().getPlaceFilter(); 
     if (!StringUtils.isEmpty(placeFilter)) { 
      placeFilter = "|" + placeFilter; 
     } 
     filter = "category:" + categoryId + append + placeFilter + "|type:posts"; 
    } 

    // Checks connection. 
    if (!Utils.hasConnection(mActivity)) { 
     Utils.callLostConnectionDialog(mActivity); 
    } else { 
     Log.i(Globals.LOG_TAG, "--------------- HeadlinesPagerFragment.updateHeadlinesList() -> " + 
      "Calling RetrofitUtils.searchMake(). Filter is '" + filter + "'."); 
     ContentManager.getInstance().setCurrentSearchedCategory(categoryId); 
     String[] fields = new String[] { pagination, sort, filter }; 
     RetrofitUtils.searchMake(mActivity, mFragment, null, fields, 
      SearchMakeEnum.HEADLINES_PAGER_FRAGMENT, Utils.hourglass(mActivity)); 
    } 
} 

//-------------------------------------------------- 
// Callback 
//-------------------------------------------------- 

public void checkValidHeadlineList(Boolean append, CustomProgressDialog progressDialog) { 
    Log.i(Globals.LOG_TAG, "--------------- HeadlinesPagerFragment.checkValidHeadlineList()."); 
    getLayoutInstances(); 
    Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.checkValidHeadlineList() -> " + 
     "getLayoutInstances()."); 
    List<Post> postList = ContentManager.getInstance().getPostList(); 
    if (postList == null) { 
     mRecyclerView.setVisibility(View.GONE); 
     mEmptyTextView.setVisibility(View.VISIBLE); 
    } else { 
     mHeadlineList = RecyclerViewUtils.getHeadlineListFromPostList(postList); 
     Boolean validHeadlineList = (mHeadlineList != null) && (mHeadlineList.size() > 0); 
     if (validHeadlineList) { 
      if (append) { 
       Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.checkValidHeadlineList() -> Append list."); 
       mAdapter.setFilter(mHeadlineList); 
       progressDialog.cancel(); 
      } else { 
       Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.checkValidHeadlineList() -> Valid list."); 
       mEmptyTextView.setVisibility(View.GONE); 
       mSwipeRefreshLayout.setVisibility(View.VISIBLE); 
       setRecyclerView(progressDialog); 
      } 
     } else { 
      Log.i(Globals.LOG_TAG, "HeadlinesPagerFragment.checkValidHeadlineList() -> Empty list."); 
      mEmptyTextView.setVisibility(View.VISIBLE); 
      mSwipeRefreshLayout.setVisibility(View.GONE); 
      progressDialog.cancel(); 
     } 
    } 
} 

//-------------------------------------------------- 
// Handler 
//-------------------------------------------------- 

private final Runnable mHandlerChecker = new Runnable(){ 
    public void run(){ 
     try { 
      mSwipeRefreshLayout.setRefreshing(false); 
      mHandler.removeCallbacks(mHandlerChecker); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}; 
} 
+0

是的,它們是相同的,就像我們在上面的源代碼中看到的一樣。 – graffiti75

回答