2016-12-16 24 views
0

我有一個片段即將顯示來自對象列表的回收視圖中的列表。我的片段類如下:.size()方法上的NullPointerException?

// A simple {@link Fragment} subclass. 
public class RedditListFragment extends Fragment implements AsyncResponse { 

    AsyncResponse asyncResponse; 
    private RecyclerView mRecyclerView; 
    private RedditAdapter mAdapter;; 
    private List<RedditObject> objectList; 
    Parser parse; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     executeAsyncTask(); 

     View view = inflater.inflate(R.layout.fragment_reddit_list, container, false); 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.reddit_list_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     updateUI(); 

     // Inflate the layout for this fragment 
     return view; 
    } 

    public void executeAsyncTask(){ 
     DownLoadRawData downLoadRawData = new DownLoadRawData(); 
     downLoadRawData.delegate = this; 
     downLoadRawData.execute("https://www.reddit.com/r/Showerthoughts/.json"); 


     // Log.d("ERR", " TEXT WAS " + jsonTEXT); 
    } 

    @Override 
    public void processFinish(String output) { 
     Log.d("TAG", "What is happening!"); 
     Log.d("TAG", "process finished reached"); 
     parse = new Parser(output); 
     this.objectList = parse.getRedditObjectsList(); 
     Log.d("TAG", "OBJECT LIST WAS" + objectList.toString()); 
     Log.d("TAG", "The List to STring is " + parse.getRedditObjectsList().toString()); 

    } 

    public void updateUI(){ 
     List<RedditObject> listOfRedditObject = objectList; 

     mAdapter = new RedditAdapter(listOfRedditObject); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    private class RedditHolder extends RecyclerView.ViewHolder { 

     private TextView mTextView; 

     public RedditHolder(View itemView) { 
      super(itemView); 
      mTextView = (TextView) itemView; //by casting itemView to a TextView, this forces client to pass text view 
     } 
    } 

    private class RedditAdapter extends RecyclerView.Adapter<RedditHolder>{ 

     private List<RedditObject> mListOfRedditObjects; 

     public RedditAdapter(List<RedditObject> listOfRedditObject){ 
      mListOfRedditObjects = listOfRedditObject; 
     } 

     @Override 
     public RedditHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
      View view = layoutInflater.inflate(R.layout.single_reddit_listing, parent, false); 
      return new RedditHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(RedditHolder holder, int position) { 
       RedditObject redditObject = mListOfRedditObjects.get(position); 
       holder.mTextView.setText(redditObject.getmTitle()); 
     } 

     @Override 
     public int getItemCount() { 
     // Log.d("TAG ", "In the adapter and can confirm" + mListOfRedditObjects.size()); 
      return mListOfRedditObjects.size(); 
     } 
    } 
} 

在我updateUI(),我已經驗證了鏈表類列表<>不爲空。然而,出於某種原因,在我的代碼的底部,Android獲取數組的大小在getItemsCount();我總是得到這個錯誤:

12-15 21:00:11.532 26097-26097/com.example.ridhwaan.redditforfaez E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.ridhwaan.redditforfaez, PID: 26097 
    java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
    at com.example.ridhwaan.redditforfaez.RedditListFragment$RedditAdapter$override.getItemCount(RedditListFragment.java:144) 
    at com.example.ridhwaan.redditforfaez.RedditListFragment$RedditAdapter$override.access$dispatch(RedditListFragment.java) 
    at com.example.ridhwaan.redditforfaez.RedditListFragment$RedditAdapter.getItemCount(RedditListFragment.java:0) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3289) 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3186) 
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3632) 
    at android.view.View.layout(View.java:17522) 
    at android.view.ViewGroup.layout(ViewGroup.java:5612) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
    at android.view.View.layout(View.java:17522) 
    at android.view.ViewGroup.layout(ViewGroup.java:5612) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
    at android.view.View.layout(View.java:17522) 
    at android.view.ViewGroup.layout(ViewGroup.java:5612) 
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
    at android.view.View.layout(View.java:17522) 
    at android.view.ViewGroup.layout(ViewGroup.java:5612) 
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:724) 
    at android.view.View.layout(View.java:17522) 
    at android.view.ViewGroup.layout(ViewGroup.java:5612) 
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
    at (more exception lines) 

我試着2天,現在通過使用日誌報表和調試解決這個。如果你需要更多的信息,我可以給你。

這裏是異步任務等級:

public class DownLoadRawData extends AsyncTask<String, Void, String> { 

    private String mFileContents; 
    public AsyncResponse delegate = null; 

    public String getmFileContents() { 
     return mFileContents; 
    } 

    @Override 
    protected String doInBackground(String... strings) { 
     mFileContents = downloadRawJSON(strings[0]); 

     return mFileContents; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     delegate.processFinish(result); 
     Log.d("TAG", "RESULT" + result); 
    } 

    private String downloadRawJSON(String urlSpec){ 
     Log.d("TAG", "DOWNLOADING" + " " + urlSpec); 
     StringBuilder sb = new StringBuilder(); 

     try{ 
      Log.d("TAG", "ENTETRED TRY BLOCK"); 
      URL url = new URL(urlSpec); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      int response = conn.getResponseCode(); 
      Log.d("TAG" , "RESPONSE CODE" + " " + response); 
      InputStream is = conn.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 

      int charRead; 
      char[] buffer = new char[500]; 

      while(true){ 
       charRead = isr.read(buffer); // returns number read + reads into parameter 

       if(charRead <= 0){ 
        Log.d("TAG","BROKE"); 
        break; 
       } 

       sb.append(String.copyValueOf(buffer,0,charRead)); 

      } 
      return sb.toString(); 

     }catch (Exception e){ 
      Log.d("TAG", "FATAL ERROR" + " BECASE " + e.getMessage()); 
      e.printStackTrace(); 
     } 

     Log.d("TAG" , " ERROR NO DATA"); 
     return null; 
    } 
} 

在此,processFinish是一個回調方法。

+0

我假設在「DownLoadRawData」Asynctask中設置「objectList」在DownLoadRawData的onPostExecute中移動您的updateUI調用。這將有望解決它。否則,請發佈asynctask的代碼 – Hahn

+0

我添加了AsyncTask。 – Ridhwaan

+0

好的。從onCreateView中刪除updateUi。然後在processFinish回調結束時,調用updateUi。 – Hahn

回答

1

您需要的行之後打電話給你updateUI();方法 this.objectList = parse.getRedditObjectsList(); 並修改您的updateUI方法

方法public void updateUI(){

listOfRedditObject = objectList; 

    if(listOfRedditObject == null) // to avoid nullpointer exception in case if object list is null 
    { 
     List<RedditObject> listOfRedditObject = new ArrayList<>(); 
    } 

     mAdapter = new RedditAdapter(listOfRedditObject); 
     mRecyclerView.setAdapter(mAdapter); 
    } 
2

Asynctask在後臺線程上執行,updateUI()在主線程上執行。在這種情況下,您的「updateUI()」方法在Asynctask DownLoadRawData完成其執行之前正在執行。因此,您的objectList仍然爲空。

移動updateUI()方法調用到DownLoadRawDataonPostExecute()。這應該清除這個錯誤。

此外,每當你創建一個數據結構時,總是很好地初始化該對象。你的情況:

private List<RedditObject> objectList=new List<RedditObject>(); 
相關問題