错误的Android Studio项目

问题描述:

我有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]。 –

所以,当你解析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