2016-12-24 119 views
-1

我有2個活動:飼料和用戶。這兩項活動都使用同一個適配器,相同的佈局,但在第一個活動適配器裝入飼料(和崩潰),在第二個活動適配器加載用戶的飼料(不崩潰)。錯誤的Android Studio項目

這是我在控制檯發現Feed.class:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.flaunder.flaunder, PID: 5906 
       java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 
        at com.android.volley.toolbox.ImageLoader.getCacheKey(ImageLoader.java:503) 
        at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:213) 
        at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:191) 
        at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:182) 
        at com.flaunder.flaunder.QuestionsAdapter.onBindViewHolder(QuestionsAdapter.java:69) 
        at com.flaunder.flaunder.QuestionsAdapter.onBindViewHolder(QuestionsAdapter.java:30) 
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6062) 
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6095) 
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5277) 
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5153) 
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2061) 
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1445) 
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408) 
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) 
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374) 
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3183) 
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131) 
        at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) 
        at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1367) 
        at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:849) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1193) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) 
       at android 

適配器從服務器的數據庫獲取JSON和分析它們。對於Feed和用戶,json的字段是相同的。

代碼適配器:

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     regular = Typeface.createFromAsset(context.getAssets(),"OpenSans-Regular.ttf"); 
     bold = Typeface.createFromAsset(context.getAssets(),"OpenSans-Semibold.ttf"); 

     //Getting the particular item from the list 
     QuestionList questionHero = questionList.get(position); 

     //Loading image from url 
     imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader(); 
     imageLoader.get(questionHero.getUserphoto(), ImageLoader.getImageListener(holder.genUserPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert)); 
     imageLoader.get(questionHero.getPhoto(), ImageLoader.getImageListener(holder.genPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert)); 

     //Showing data on the views 
     holder.genUserPhoto.setImageUrl(questionHero.getUserphoto(), imageLoader); 
     holder.genQuestion.setText(questionHero.getQuestion()); 
     holder.genQuestion.setTypeface(bold); 
     holder.genAnswer.setText(questionHero.getAnswer()); 
     holder.genAnswer.setTypeface(regular); 
     holder.genFroms.setText(questionHero.getFroms()); 
     holder.genFroms.setTypeface(regular); 
     holder.genTos.setText(questionHero.getTos()); 
     holder.genTos.setTypeface(regular); 
     holder.genFromslogin.setText(questionHero.getFromslogin()); 
     holder.genToslogin.setText(questionHero.getToslogin()); 
     holder.genToslogin2.setText(questionHero.getToslogin()); 
     holder.genDate.setText(questionHero.getDate()); 
     holder.genDate.setTypeface(regular); 
     holder.genLikenum.setText(questionHero.getLikenum()); 
     holder.genLikenum.setTypeface(regular); 
     holder.genCommentnum.setText(questionHero.getCommentnum()); 
     holder.genCommentnum.setTypeface(regular); 
     holder.genPhoto.setImageUrl(questionHero.getPhoto(), imageLoader); 
     holder.genVideo.setText(questionHero.getVideo()); 
     holder.genId.setText(questionHero.getQid()); 

    } 

飼料:

private void parseData(JSONArray array) { 
     for (int i = 0; i < array.length(); i++) { 
      //Creating the superhero object 
      QuestionList qHero = new QuestionList(); 
      JSONObject json = null; 
      try { 
       //Getting json 
       json = array.getJSONObject(i); 

       //Adding data to the superhero object 
       qHero.setQuestion(json.getString("question")); 
       qHero.setAnswer(json.getString("answer")); 
       qHero.setUserphoto(json.getString("userphoto")); 
       qHero.setFroms(json.getString("froms")); 
       qHero.setTos(json.getString("tos")); 
       qHero.setFromslogin(json.getString("fromslogin")); 
       qHero.setToslogin(json.getString("toslogin")); 
       qHero.setDate(json.getString("date")); 
       qHero.setLikenum(json.getString("likenum")); 
       qHero.setCommentnum(json.getString("commentnum")); 
       qHero.setPhoto(json.getString("photo")); 
       qHero.setVideo(json.getString("video")); 
       qHero.setQid(json.getString("id")); 

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

      //Adding the superhero object to the list 
      listQuestions.add(qHero); 
     } 

     //Notifying the adapter that data has been added or changed 
     adapter.notifyDataSetChanged(); 
    } 

適配器初始化:

class ViewHolder extends RecyclerView.ViewHolder{ 
     //Views 
     public NetworkImageView genUserPhoto; 
     public TextView genQuestion; 
     public TextView genAnswer; 
     public TextView genFroms; 
     public TextView genTos; 
     public TextView genFromslogin; 
     public TextView genToslogin; 
     public TextView genToslogin2; 
     public TextView genDate; 
     public TextView genLikenum; 
     public TextView genCommentnum; 
     public NetworkImageView genPhoto; 
     public TextView genVideo; 
     public TextView genId; 
     public TextView genPhotourl; 
     public CardView cardRview; 

     //Initializing Views 
     public ViewHolder(View itemView) { 
      super(itemView); 
      genUserPhoto = (NetworkImageView) itemView.findViewById(R.id.genUserPhoto); 
      genQuestion = (TextView) itemView.findViewById(R.id.genQuestion); 
      genAnswer = (TextView) itemView.findViewById(R.id.genAnswer); 
      genFroms = (TextView) itemView.findViewById(R.id.genFroms); 
      genTos = (TextView) itemView.findViewById(R.id.genTos); 
      genFromslogin = (TextView) itemView.findViewById(R.id.genFromslogin); 
      genToslogin = (TextView) itemView.findViewById(R.id.genToslogin); 
      genToslogin2 = (TextView) itemView.findViewById(R.id.genToslogin2); 
      genDate = (TextView) itemView.findViewById(R.id.genDate); 
      genLikenum = (TextView) itemView.findViewById(R.id.genLikenum); 
      genCommentnum = (TextView) itemView.findViewById(R.id.genCommentnum); 
      genPhoto = (NetworkImageView) itemView.findViewById(R.id.genPhoto); 
      genVideo = (TextView) itemView.findViewById(R.id.genVideo); 
      genId = (TextView) itemView.findViewById(R.id.genId); 
      genPhotourl = (TextView) itemView.findViewById(R.id.genPhotourl); 
      cardRview = (CardView) itemView.findViewById(R.id.cardRview); 
     } 
    } 
+0

分享一些代碼 –

+0

崩潰日誌將如何幫助無碼? –

+0

請發表[mcve]。 –

回答

1

所以,當你解析JSON某些按鍵可以爲空或不存在。在這種情況下,你的questionHero將包含null。所以調用代碼之前,你應該檢查你一樣可以questionHero.getPhoto()

爲什麼需要可視性或重新寫這個

if (questionHero.getUserphoto() != null) { 
//in case you handle visibility in else block make //holder.genUserPhoto.setVisibility(View.VISIBLE) here visible 
    imageLoader.get(questionHero.getUserphoto(), ImageLoader.getImageListener(holder.genUserPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert)); 
    } else { 
//reset image by questionHero.genUserPhoto.setImageBitmap(null), or handle //visibility of holder.genUserPhoto 
} 

一樣嗎?

Recycler視圖重複使用物品,以便在其他位置重複使用相同的視圖,以防您不處理時最終會在錯誤的位置顯示錯誤的圖像。

的性能提示夫婦

regular = Typeface.createFromAsset(context.getAssets(),"OpenSans-Regular.ttf"); 
     bold = Typeface.createFromAsset(context.getAssets(),"OpenSans-Semibold.ttf"); 

永遠不要糾正這種代碼在bindViewHolder,這種方法將再次當您滾動調用和阿恩,每次它將從資產創建字體是不夠的任務使您的滾動滯後。你應該爲此創建一個單例類,它將創建一次字體並緩存它,並在需要時提供給應用程序。

holder.genDate.setTypeface(regular); 
imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader(); 

現在你已經寫在bindViewHolder這段代碼,將這個代碼createViewHolder,因爲設置字體就足夠了一次類似的,你應該得到的圖像加載一次雖然它不會有太大的區別爲ImageLoader的本身單,但仍然其良好的有在ViewHolder水平,只將每個回收視圖項改變數據或視性能應在bindViewHolder方法來處理。

+0

哦,非常感謝您的幫助,解決方案,時間和提示!你真是個好人! – HEISENBERG