NullPointerException异常到RecyclerView.setLayoutManager方法
问题描述:
我面对这个错误在我的应用程序: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();
}
}
};
}
是的,它们是相同的,就像我们在上面的源代码中看到的一样。 – graffiti75