错误的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);
}
}
所以,当你解析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方法来处理。
哦,非常感谢您的帮助,解决方案,时间和提示!你真是个好人! – HEISENBERG
分享一些代码 –
崩溃日志将如何帮助无码? –
请发表[mcve]。 –