嵌套回收器视图:尝试从字段'android.support.v7.widget.ViewInfoStore android.support.v7.widget.RecyclerView.mViewInfoStore'中读取

时间:2018-04-12 14:34:11

标签: android android-fragments android-recyclerview android-viewpager android-adapter

我是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);
    }
}

1 个答案:

答案 0 :(得分:0)

这种方法存在两个密切相关的问题:

  1. mSubjectRecyclerview具有全局范围,而每个父级RecyclerView项应该有一个实例,即每个SubBranchHolder
  2. mSubjectRecyclerview从未设置LayoutManager。
  3. 另外,您可能会考虑为这两个RecyclerView使用更多不同的名称,我觉得这个命名的相似性首先引起了混淆。