在将recyclerview添加到片段中时更正空对象引用

时间:2016-12-29 21:08:54

标签: android-fragments android-recyclerview

尝试使用自定义适配器在片段内部实现recycleview并收到以下错误。

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference。在StoreAdapter.getItemCount(StoreAdapter.java:xx)

我环顾四周,但没有看到任何导致解决方案的事情。任何帮助,将不胜感激。

Android app - Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

和其他几个人

StoreAdapter

public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.StoreHolder>{

private LayoutInflater mInflator;
private List<Store> mStore= Collections.emptyList();
private Context mContext;

public StoreAdapter(Context mContext, List<Store> mStore){
    mInflator = LayoutInflater.from(mContext);
    this.mStore = mStore;
    this.mContext = mContext;
}

// Simple nested class that holds the various view components for the adapter
// and as specified in *layout.xml .
public class StoreHolder extends RecyclerView.ViewHolder{
    TextView mStoreTitle, mStoreDetails, mStoreCategory;

    public StoreHolder (View itemView){
        super(itemView);
        mStoreTitle = (TextView) itemView.findViewById(R.id.title);
        mStoreDetails = (TextView) itemView.findViewById(R.id.details);
        mStoreCategory = (TextView) itemView.findViewById(R.id.category);

    }
}
// Called when the RecyclerView needs a new RecyclerView.ViewHolder (*Holder)
// to represent an item.  We inflate the XML layout and return our view (*Holder)
@Override
public StoreHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflator.inflate(R.layout.todo_list_row, parent,false);
    return new StoreHolder(view);
    }

// Called by RecyclerView to display the data at the specified position.
// This method needs to update the contents of the view to reflect the item at the
// given position e.g. we are updating the view here with the data
@Override
public void onBindViewHolder(StoreAdapter.StoreHolder holder, int position) {
    holder.mStoreTitle.setText(mStore.get(position).getStoreTitle());
    holder.mStoreDetails.setText(mStore.get(position).getStoreDetails());
    holder.mStoreCategory.setText(mStore.get(position).getStoreCategory());
}


public void setData(List<Store> store){
    this.mStore = store;
}

public void delete(int position){
    mStore.remove(position);
    notifyItemRemoved(position);
}

@Override
public int getItemCount() {
    return mStore.size();
    }
}

StoreSectionLoader

public class StoreSectionLoader extends AsyncTaskLoader<List<Store>> {

private static final String LOG_TAG = StoreSectionLoader.class.getSimpleName();
private List<Store> mStore;
private ContentResolver mContentResolver;
private Cursor mCursor;

public StoreSectionLoader(Context context, Uri uri, ContentResolver contentResolver){
    super(context);
    mContentResolver = contentResolver;
}

@Override
public List<Store> loadInBackground() {
    String[] projection = {BaseColumns._ID,
    RetailFinderContract.RetailFinderColumns.STORE_COMPLETE,
            RetailFinderContract.RetailFinderColumns.STORE_CREATED,
            RetailFinderContract.RetailFinderColumns.STORE_TITLE,
            RetailFinderContract.RetailFinderColumns.STORE_DETAILS,
            RetailFinderContract.RetailFinderColumns.STORE_CATEGRORY};
    List<Store> entry = new ArrayList<>();
    Uri uri = RetailFinderContract.URI_LOCATION_TABLE;
    mCursor = mContentResolver.query(uri, projection, null, null, null);
    if(mCursor != null){
        if(mCursor.moveToFirst()){
            do {
                int _id = mCursor.getInt(mCursor.getColumnIndex(BaseColumns._ID));
                String store_title = mCursor.getString(
                        mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_TITLE));
                String store_details = mCursor.getString(
                        mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_DETAILS));
                String store_category = mCursor.getString(
                        mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_CATEGRORY));
                Store store = new Store(_id,store_title,store_details,store_category);
                entry.add(store);

            } while (mCursor.moveToNext());
        }
    }
    return entry;
}

@Override
public void deliverResult(List<Store> store) {
    if(isReset()){
        if (mStore != null){
            mCursor.close();
        }
    }

    List<Store> oldStoreList = mStore;
    if(mStore == null || mStore.size() == 0 ){
        Log.d(LOG_TAG, "+++++++++++++++ No Data returned");
    }
    mStore = store;
    if(isStarted()){
        super.deliverResult(store);
    }
    if(oldStoreList != null && oldStoreList != store){
        mCursor.close();
    }

}

@Override
protected void onStartLoading() {
    if(mStore != null){
        deliverResult(mStore);
    }

    if(takeContentChanged() || mStore == null){
        forceLoad();
    }
}

@Override
protected void onStopLoading() {
    cancelLoad();
}

@Override
protected void onReset() {
    onStopLoading();
    if(mCursor != null){
        mCursor.close();
    }
    mStore = null;

}


@Override
public void onCanceled(List<Store> store) {
    super.onCanceled(store);
    if(mCursor != null){
        mCursor.close();
    }
        }

@Override
public void forceLoad() {
    super.forceLoad();
}
}

StoreFragment

public class StoreFragment extends Fragment implements
    LoaderManager.LoaderCallbacks<List<Store>> {


private static final String LOG_TAG = StoreListFragment.class.getSimpleName();
private StoreAdapter mAdapter;
private static final int LOADER_ID = 1;
private ContentResolver mContentReslover;
private List<Store> mStore;
private Context mContext;

protected RecyclerView mRecyclerView;
private static final String TAG = "RecyclerViewFragment";
private static final String KEY_LAYOUT_MANAGER = "layoutManager";

private enum LayoutManagerType {
    GRID_LAYOUT_MANAGER,
    LINEAR_LAYOUT_MANAGER
}

protected LayoutManagerType mCurrentLayoutManagerType;
protected RecyclerView.LayoutManager mLayoutManager;

// end added
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
    mContentReslover = getActivity().getContentResolver();
    getLoaderManager().initLoader(LOADER_ID, null, this);

}




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.store_list_row, container, false);
    rootView.setTag(TAG);
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.t_recycler);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;

    if (savedInstanceState != null) {
        // Restore saved layout manager type.
        mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
                .getSerializable(KEY_LAYOUT_MANAGER);
    }
    setRecyclerViewLayoutManager(mCurrentLayoutManagerType);

    mAdapter = StoreAdapter(getContext(), mStore); //issue
    mRecyclerView.setAdapter(mAdapter);


    return rootView;
}

public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
    int scrollPosition = 0;

    // If a layout manager has already been set, get current scroll position.
    if (mRecyclerView.getLayoutManager() != null) {
        scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
                .findFirstCompletelyVisibleItemPosition();
    }

    switch (layoutManagerType) {

        case LINEAR_LAYOUT_MANAGER:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
            break;
        default:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    }

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.scrollToPosition(scrollPosition);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save currently selected layout manager.
    savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
    super.onSaveInstanceState(savedInstanceState);
}




@Override
public Loader<List<Store>> onCreateLoader(int id, Bundle args) {
    mContentReslover = getActivity().getContentResolver();
    return new StoreSectionLoader(getActivity(), RetailFinderContract.URI_STORES_TABLE, mContentReslover);

}

@Override
public void onLoadFinished(Loader<List<Store>> loader, List<Store> store) {
    mAdapter.setData(store);
    mStore = store;


}

@Override
public void onLoaderReset(Loader<List<Store>> loader) {
    mAdapter.setData(null);
}
}

0 个答案:

没有答案