2016-02-18 77 views
1

我從我的CMS獲取了一些新聞數據,並且想要在RecyclerView中顯示它們。問題是我在使用LinearLayoutManager的行中收到空指針異常。這是logcat輸出。具有空指針異常的RecyclerView

Caused by: java.lang.NullPointerException 
    at testing.theo.manchesterunitedapp.newsandfeatures.FeaturesFragment.onCreateView(FeaturesFragment.java:65) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
    at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) 
    at android.app.Activity.performStart(Activity.java:5241) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)  
    at android.app.ActivityThread.access$800(ActivityThread.java:135)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:136)  
    at android.app.ActivityThread.main(ActivityThread.java:5001)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:515) 

我在做web服務部分的片段非常簡單。我使用回調方法。 onCreateView我在初始化ArrayList和RecyclerView,其次是onActivityCreate,我運行webservice。

public class FeaturesFragment extends Fragment { 

public static final String TAG = "ManuApp"; 
private static final String IMAGE_URL = "xxxxxxxxxxxx/xxxx/features_images/" ; 
private List<FeaturesObject> listItemsList; 

private RecyclerView mRecyclerView; 
private FeaturesAdapter adapter; 

public FeaturesFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.features_row, container, false); 
    // Inflate the layout for this fragment 
    listItemsList = new ArrayList<>(); 
    mRecyclerView = (RecyclerView)v.findViewById(R.id.features_recycler_view); 
    //mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).color(Color.BLACK).build()); 

    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 


    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    updateFeaturesList(); 
} 

public void updateFeaturesList() { 




    //declare the adapter and attach it to the recyclerview 
    adapter = new FeaturesAdapter(getActivity(), listItemsList); 
    mRecyclerView.setAdapter(adapter); 

    // Instantiate the RequestQueue. 
    RequestQueue queue = Volley.newRequestQueue(getActivity()); 



    // Request a string response from the provided URL. 
    JsonArrayRequest jsObjRequest = new JsonArrayRequest(Request.Method.GET, Config.URL_FEATURES, new Response.Listener<JSONArray>() { 

     @Override 
     public void onResponse(JSONArray response) { 

      Log.d(TAG, response.toString()); 
      //hidePD(); 

      // Parse json data. 
      // Declare the json objects that we need and then for loop through the children array. 
      // Do the json parse in a try catch block to catch the exceptions 
      try { 



       for (int i = 0; i < response.length(); i++) { 

        JSONObject post = response.getJSONObject(i); 
        FeaturesObject item = new FeaturesObject(); 
        item.setTitle(post.getString("title")); 
        item.setImage(IMAGE_URL + post.getString("features_image")); 
        item.setArticle(post.getString("article")); 



        listItemsList.add(item); 

       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      // Update list by notifying the adapter of changes 
      adapter.notifyDataSetChanged(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      //hidePD(); 
     } 
    }); 
    jsObjRequest.setRetryPolicy(new RetryPolicy() { 
     @Override 
     public int getCurrentTimeout() { 
      return 50000; 
     } 

     @Override 
     public int getCurrentRetryCount() { 
      return 50000; 
     } 

     @Override 
     public void retry(VolleyError error) throws VolleyError { 

     } 
    }); 
    queue.add(jsObjRequest); 

} 
} 

這段代碼導致了這個問題。

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 

這很奇怪,因爲我使用相同的技巧來獲取我應用程序的另一個片段中的數據。

任何想法?

謝謝。

+0

您是否嘗試過的recyclerView –

+0

我做只是現在加入setHasFixedSize(真),但我仍然有同樣的問題:( - – Theo

+0

這行拋出異常準確 – jbarat

回答

2

您的RecyclerView爲空。你確定你正在尋找正確的佈局文件中的ID嗎?我的猜測是要麼膨脹錯誤的佈局文件,要麼您正在尋找RecyclerView的錯誤視圖ID。

+0

是的,那是問題所在,我使用了錯誤的xml文件! – Theo

1

好像你正在努力尋找它不是features_row這就是爲什麼你在該行獲得NullPointerException的ID:

mRecyclerView = (RecyclerView)v.findViewById(R.id.features_recycler_view); 

如果你不斷收到錯誤,您可以試試這個:

final FragmentActivity c = getActivity(); 
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(c); 
mRecyclerView.setLayoutManager(linearLayoutManager); 
2

可能情況並非如此,但是......通常,所有需要實例活動的初始化必須位於onActivityCreated()(或Fragment生命週期中的下一個方法)中。內部onCreateView() getActivity()不保證返回非空值。在某些情況下,它返回null。