2015-06-26 18 views
0

所以即時得到這個錯誤java.lang.NullPointerException 在android.support.v7.widget.RecyclerView.onMeasure 在我設置適配器後的主要活動。Android中的空指針異常錯誤回收視圖?

林不知道它在做什麼錯。我試圖閱讀關於此的其他問題,但解決方案不起作用。將不勝感激,如果有人可以指導我在正確的方向作爲新的Android編程。謝謝。

而且,這裏是完整的錯誤

log:06-26 12:41:50.014 31158-31158/alexgwartney.treehouseblogreader E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: alexgwartney.treehouseblogreader, PID: 31158 
    java.lang.NullPointerException 
      at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764) 
      at android.view.View.measure(View.java:16849) 
      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:824) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:500) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:444) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:742) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:607) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2368) 
      at android.view.View.measure(View.java:16849) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1334) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1532) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6282) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
      at android.view.Choreographer.doFrame(Choreographer.java:560) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
      at android.os.Handler.handleCallback(Handler.java:808) 
      at android.os.Handler.dispatchMessage(Handler.java:103) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5323) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
      at dalvik.system.NativeStart.main(Native Method) 

public class MainActivity extends ActionBarActivity { 
public String url = "http://blog.teamtreehouse.com/api/get_recent_summary/?count=20"; 
public static final String TAG = MainActivity.class.getSimpleName(); 
private RecyclerView mRecyclerView; 
private RecyclerView.Adapter mAdapter; 

content[] mDataset; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 

    if(isNetworkAvailable()) { 
     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder() 
       .url(url) 
       .build(); 

     Call call = client.newCall(request); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Request request, IOException e) { 

      } 

      @Override 
      public void onResponse(Response response) throws IOException { 
       try { 
        String jsonData = response.body().string(); 
        Log.v(TAG, jsonData); 
        if (response.isSuccessful()) { 
         getCurrentDetails(jsonData); 
         mAdapter = new MyAdapter(mDataset); 
         mRecyclerView.setAdapter(mAdapter); 

         RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); 
         mRecyclerView.setLayoutManager(layoutManager); 

         mRecyclerView.setHasFixedSize(true); 
        } 
       } catch (IOException e) { 
        Log.e(TAG, "Exception caught: ", e); 
       } catch (JSONException e) { 
        Log.e(TAG, "Exception caught: ", e); 
       } 
      } 
     }); 
    } 


} 


private content[] getCurrentDetails(String jsonData) throws JSONException { 
    JSONObject forecast = new JSONObject(jsonData); 

    JSONArray data = forecast.getJSONArray("posts"); 

    mDataset = new content[data.length()]; 

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

     JSONObject jsonDay = data.getJSONObject(i); 
     content day = new content(); 

     day.setId(jsonDay.getInt("id")); 
     day.setUrl(jsonDay.getString("url")); 
     day.setTitle(jsonDay.getString("title")); 
     day.setDate(jsonDay.getString("date")); 
     day.setAuthor(jsonDay.getString("author")); 
     day.setThumbnail(jsonDay.getString("thumbnail")); 
     mDataset[i] = day; 
    } 


    return mDataset; 

} 


// This will check if there is a net work conection 
private boolean isNetworkAvailable() { 
    ConnectivityManager manager = (ConnectivityManager) 
      getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 
    boolean isAvailable = false; 
    if (networkInfo != null && networkInfo.isConnected()) { 
     isAvailable = true; 
    } 
    return isAvailable; 
} 

}

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.HourViewHolder> { 
public content[] mDataset; 


public MyAdapter(content[] data) { 
    mDataset = data; 

} 




// the lay out is not the correct lay out but its just there for a example. 
@Override 
public HourViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.test, parent, false); 
    HourViewHolder viewHolder = new HourViewHolder(view); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(HourViewHolder holder, int position) { 
    holder.bindHour(mDataset[position]); 
} 

@Override 
public int getItemCount() { 
    return mDataset.length; 
} 

public class HourViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    public TextView mId; 
    public TextView mUrl; 
    public TextView mTitle; 
    public TextView mDate; 
    public TextView mAuthor; 
    public TextView mThumbnail; 

    public HourViewHolder(View itemView) { 
     super(itemView); 

     mId = (TextView) itemView.findViewById(R.id.blogid); 
     mUrl= (TextView) itemView.findViewById(R.id.url); 
     mTitle = (TextView) itemView.findViewById(R.id.title); 
     mDate = (TextView) itemView.findViewById(R.id.date); 
     mAuthor = (TextView) itemView.findViewById(R.id.author); 
     mThumbnail= (TextView) itemView.findViewById(R.id.thumbnail); 
    } 

    public void bindHour(content hour) { 
     mId.setText(hour.getId()); 
     mUrl.setText(hour.getUrl()); 
     mTitle.setText(hour.getTitle()); 
     mDate.setText(hour.getDate()); 
     mAuthor.setText(hour.getAuthor()); 
     mThumbnail.setText(hour.getThumbnail()); 
    } 

    @Override 
    public void onClick(View view) { 

    } 
} 

}

+0

此外,如果你想讓我發佈適配器代碼讓我知道謝謝你。 –

+0

對於哪一行你得到空指針exception..Also發佈錯誤日誌 – Psypher

+0

試試這個--'LinearLayoutManager lm = new LinearLayoutManager(getApplicationContext()); lm.setOrientation(LinearLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(lm);' – Psypher

回答

0

設置適配器之前設置的layoutManager。讓我知道這是否有效。

+0

nope同樣的錯誤 –

0

您應該在您的創建中初始化recyclerview,而不是在您的回調中。

protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
    //init recyclerview 
      mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); 
      mRecyclerView.setLayoutManager(layoutManager); 
      mRecyclerView.setHasFixedSize(true); 
      mAdapter = new MyAdapter(new MyAdatpter()); 
      mRecyclerView.setAdapter(mAdapter); 

      if (isNetworkAvailable()) { 
       OkHttpClient client = new OkHttpClient(); 
       Request request = new Request.Builder() 
         .url(url) 
         .build(); 

       Call call = client.newCall(request); 
       call.enqueue(new Callback() { 
        @Override 
        public void onFailure(Request request, IOException e) { 

        } 

        @Override 
        public void onResponse(Response response) throws IOException { 
         try { 
          String jsonData = response.body().string(); 
          Log.v(TAG, jsonData); 
          if (response.isSuccessful()) { 
// only switch the recyclerview adapter 
// or extend your adapter with a clear() and add(List<>) function to avoid creating always a new adapter 
// This code must run on ui thread 
           mRecyclerView.setAdapter(new MyAdapter(getCurrentDetails(jsonData))); 
          } 
         } catch (IOException e) { 
          Log.e(TAG, "Exception caught: ", e); 
         } catch (JSONException e) { 
          Log.e(TAG, "Exception caught: ", e); 
         } 
        } 
       }); 
      } 
     } 

添加評論。

+0

哪些部分是您建議OP更改的?他們將如何解決他的問題? –

0

所以我想通了,我需要在主UI線程上運行適配器。

public class MainActivity extends ActionBarActivity { 

    public String url = "http://blog.teamtreehouse.com/api/get_recent_summary/?count=20"; 
    public static final String TAG = MainActivity.class.getSimpleName(); 
    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 

    content[] mDataset; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(layoutManager); 


     if(isNetworkAvailable()) { 
      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder() 
        .url(url) 
        .build(); 

      Call call = client.newCall(request); 
      call.enqueue(new Callback() { 
       @Override 
       public void onFailure(Request request, IOException e) { 

       } 

       @Override 
       public void onResponse(Response response) throws IOException { 
        try { 
         String jsonData = response.body().string(); 
         Log.v(TAG, jsonData); 
         if (response.isSuccessful()) { 
          getCurrentDetails(jsonData); 

          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            mAdapter = new MyAdapter(mDataset); 
            mRecyclerView.setAdapter(mAdapter); 
           } 
          }); 



         } 
        } catch (IOException e) { 
         Log.e(TAG, "Exception caught: ", e); 
        } catch (JSONException e) { 
         Log.e(TAG, "Exception caught: ", e); 
        } 
       } 
      }); 
     } 
    } 

    private content[] getCurrentDetails(String jsonData) throws JSONException { 
     JSONObject forecast = new JSONObject(jsonData); 
     JSONArray data = forecast.getJSONArray("posts"); 
     mDataset = new content[data.length()]; 

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

      JSONObject jsonDay = data.getJSONObject(i); 
      content day = new content(); 

      day.setId(jsonDay.getInt("id")); 
      day.setUrl(jsonDay.getString("url")); 
      day.setTitle(jsonDay.getString("title")); 
      day.setDate(jsonDay.getString("date")); 
      day.setAuthor(jsonDay.getString("author")); 
      day.setThumbnail(jsonDay.getString("thumbnail")); 
      mDataset[i] = day; 
     } 
     return mDataset; 
    } 

    // This will check if there is a net work conection 
    private boolean isNetworkAvailable() { 
     ConnectivityManager manager = (ConnectivityManager) 
       getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 
     boolean isAvailable = false; 
     if (networkInfo != null && networkInfo.isConnected()) { 
      isAvailable = true; 
     } 
     return isAvailable; 
    } 
}