簡體   English   中英

E/RecyclerView:沒有附加適配器; 嘗試將 TextView 添加到布局時跳過布局

[英]E/RecyclerView: No adapter attached; skipping layout while trying to add TextView to layout

當適配器為空時,我試圖在新的 TextView 中顯示一條消息,但我不斷收到以下錯誤:E/RecyclerView:未連接適配器; 跳過布局。

發生錯誤的方法:

    @BindView(R.id.courses_recycler_view)
    RecyclerView coursesRecyclerView;

   private CoursesAdapter coursesAdapter;
   private List<CourseEntity> coursesData = new ArrayList<>();
   private TextView noCourses;

   private void initViewModel() {
        final Observer<List<CourseEntity>> coursesObserver = new Observer<List<CourseEntity>>() {
            @Override
            public void onChanged(List<CourseEntity> courseEntities) {
                coursesData.clear();
                coursesData.addAll(courseEntities);

                if(coursesAdapter == null) {
                    coursesAdapter = new CoursesAdapter(coursesData, TermDetailsActivity.this);
                    coursesRecyclerView.setAdapter(termsAdapter);
                    if (coursesAdapter.getItemCount() == 0) {
                        noCourses = new TextView(getApplicationContext());
                        noCourses.setId(R.id.noTerms);
                        ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
                                ConstraintLayout.LayoutParams.WRAP_CONTENT,
                                ConstraintLayout.LayoutParams.WRAP_CONTENT);
                        noCourses.setLayoutParams(lp);
                        noCourses.setText("No terms found.");
                        noCourses.setTextColor(Color.parseColor("#000000"));
                        coursesLayout.addView(noCourses);

                        ConstraintSet cs = new ConstraintSet();
                        cs.constrainHeight(noCourses.getId(), ConstraintSet.WRAP_CONTENT);
                        cs.constrainWidth(noCourses.getId(), ConstraintSet.WRAP_CONTENT);
                        cs.connect(noCourses.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 0);
                        cs.connect(noCourses.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
                        cs.connect(noCourses.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
                        cs.connect(noCourses.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0);
                        cs.applyTo(coursesLayout);
                    }
                } else {
                    coursesAdapter.notifyDataSetChanged();
                }
            }
        };
        termDetailsViewModel = new ViewModelProvider(this).get(TermDetailsViewModel.class);
        termDetailsViewModel.mCourses.observe(this, coursesObserver);

    }

我的適配器類:

public class CoursesAdapter extends RecyclerView.Adapter<CoursesAdapter.ViewHolder> {

    String pattern = "MM/dd/yyyy";
    DateFormat df = new SimpleDateFormat(pattern);

    public final List<CourseEntity> mCourses;
    private final Context mContext;

    public CoursesAdapter(List<CourseEntity> mCourses, Context mContext) {
        this.mCourses = mCourses;
        this.mContext = mContext;
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.courses_list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final CourseEntity course = mCourses.get(position);

        String courseStartDate = df.format(course.getCourseStartDate());
        String courseEndDate = df.format(course.getCourseEndDate());

        holder.courseName.setText(course.getCourseName());
        holder.courseStartDate.setText(courseStartDate);
        holder.courseEndDate.setText(courseEndDate);

        holder.courseListItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

    @Override
    public int getItemCount() {
        return mCourses.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.list_course_name)
        TextView courseName;
        @BindView(R.id.list_course_start_date)
        TextView courseStartDate;
        @BindView(R.id.list_course_end_date)
        TextView courseEndDate;
        @BindView(R.id.course_list_layout)
        ConstraintLayout courseListItem;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

TextView 正在以這種方式添加,因為這是一個學校項目,部分要求是能夠以編程方式添加視圖。

您看到此警告是因為在屏幕上繪制視圖時沒有為 RecyclerView 設置適配器。 您正在異步加載數據,然后稍后在 RecyclerView 上調用setAdapter() 因此,當視圖顯示時,數據仍在加載,您還沒有設置適配器。

你正在做的很好,但如果你不想收到這個警告,你可以給適配器一個空列表,並在視圖初始化期間設置它。 然后您可以異步更新該列表並調用notifyDataSetChanged()來告訴 RecyclerView 刷新本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM