我是Android的新手,并且已经实施了2天的回收站视图嵌套并面临这个问题,请帮助我。
我有一个 TabsActivity ,我托管了 VideoFragment ,因为我需要在垂直Recyclerview中实现水平回收视图(嵌套回收站视图< /强>)。当我运行应用程序时,它会崩溃与Android API相关的NPE。
我不知道如何解决这个问题,请帮我解决这个问题,谢谢Adv。
java.lang.NullPointerException: Attempt to read from field 'android.support.v7.widget.ViewInfoStore android.support.v7.widget.RecyclerView.mViewInfoStore' on a null object reference
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8194)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8180)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8168)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1573)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
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:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1769)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:894)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
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:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
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:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
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:2680)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5438)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2207)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1963)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6064)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
at android.view.Choreographer.doCallbacks(Choreographer.java:672)
at android.view.Choreographer.doFrame(Choreographer.java:608)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Chor
04-12 14:30:53.688 1329-1939/? E/ActivityManager: Invalid thumbnail
dimensions: 0x0
04-12 14:30:54.238 1793-1793/? E/adTracker: Value incall of type
java.lang.String cannot be converted to JSONObject
VideoFragment.java,
public class VideoFragment extends Fragment {
private RecyclerView mSubBranchRecyclerview;
private RecyclerView mSubjectRecyclerview;
private SubBranchAdapter mSubBranchAdapter;
private SubjectAdapter mSubjectAdapter;
public VideoFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_video, container, false);
List<SubBranch> mSubBranches = new ArrayList<>();
SubBranch subBranch=new SubBranch();
subBranch.setName("Programming");
List<Subject> subjects= new ArrayList<>();
Subject subject = new Subject();
subject.setName("Javada");
subjects.add(subject);
subBranch.setSubjectList(subjects);
mSubBranches.add(subBranch);
mSubBranchRecyclerview = view.findViewById(R.id.sub_branch_recyclerview);
mSubBranchRecyclerview.setHasFixedSize(true);
mSubBranchAdapter = new SubBranchAdapter(getActivity(),mSubBranches);
mSubBranchRecyclerview.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mSubBranchRecyclerview.setAdapter(mSubBranchAdapter);
return view;
}
SubBranchHolder.java,SubBranchAdapter.java,(垂直回收者视图)
public class SubBranchHolder extends RecyclerView.ViewHolder {
private TextView mSubBranchTView;
private RecyclerView mSubjectRecycler;
public SubBranchHolder(View view) {
super(view);
mSubBranchTView = view.findViewById(R.id.sub_branch_tview);
mSubjectRecycler = view.findViewById(R.id.subjectsRecyclerView);
}
}
public class SubBranchAdapter extends RecyclerView.Adapter<SubBranchHolder>{
private List<SubBranch> mSubBranches;
private Context context;
public SubBranchAdapter(Context context, List<SubBranch> mSubBranches) {
this.context = context;
this.mSubBranches = mSubBranches;
}
@NonNull
@Override
public SubBranchHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_sub_branch,null);
return new SubBranchHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SubBranchHolder holder, int position) {
SubBranch subBranch = mSubBranches.get(position);
List<Subject> subjects = subBranch.getSubjectList();
SubjectAdapter subjectAdapter = new SubjectAdapter(context, subjects);
holder.mSubBranchTView.setText(subBranch.getName());
holder.mSubjectRecycler.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
mSubBranchRecyclerview.setLayoutManager(layoutManager);
holder.mSubjectRecycler.setAdapter(subjectAdapter);
}
@Override
public int getItemCount() {
return (null != mSubBranches ? mSubBranches.size() : 0);
}
}
SubjectHolder.java,SubjectAdapter.java(用于水平回收者视图)
public class SubjectHolder extends RecyclerView.ViewHolder{
private Button mSubjectBtn;
public SubjectHolder(View view) {
super(view);
mSubjectBtn = view.findViewById(R.id.subject_btn);
}
public void bind(Subject subject) {
mSubjectBtn.setText(subject.getName());
mSubjectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getActivity(), "ButtonClicked", Toast.LENGTH_LONG).show();
}
});
}
}
public class SubjectAdapter extends RecyclerView.Adapter<SubjectHolder> {
private Context mContext;
private List<Subject> mSubjects;
public SubjectAdapter(Context context, List<Subject> subjects) {
mContext = context;
mSubjects = subjects;
}
@NonNull
@Override
public SubjectHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_subject, null);
SubjectHolder subjectHolder = new SubjectHolder(view);
return subjectHolder;
}
@Override
public void onBindViewHolder(@NonNull SubjectHolder holder, int position) {
Subject subject = mSubjects.get(position);
holder.bind(subject);
}
@Override
public int getItemCount() {
return(null != mSubjects ? mSubjects.size() : 0);
}
}
答案 0 :(得分:0)
这种方法存在两个密切相关的问题:
mSubjectRecyclerview
具有全局范围,而每个父级RecyclerView项应该有一个实例,即每个SubBranchHolder
。mSubjectRecyclerview
从未设置LayoutManager。另外,您可能会考虑为这两个RecyclerView使用更多不同的名称,我觉得这个命名的相似性首先引起了混淆。