【问题标题】:No adapter attached; skipping layout : RecyclerView & Adapter未连接适配器;跳过布局:RecyclerView & Adapter
【发布时间】:2019-09-22 01:05:40
【问题描述】:

我已经看到很多关于这个问题的答案,但对我的编码没有任何帮助。

我参考了基于此youtube 视频的代码,现在我遇到了这个问题。不知道他的代码是如何工作的,而我的不是。显然我也是这个话题的新手(RecyclerView)。

这是我的主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_product)  ;

    ref = FirebaseDatabase.getInstance().getReference().child("buddymealplanneruser").child("Products");
    recyclerView = findViewById(R.id.stallproductRecyclerView);

    //newest
    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(manager);
    recyclerView.setHasFixedSize(true);
    //
    searchView = findViewById(R.id.searchProductStall);

}

@Override
protected void onRestart() {
    super.onRestart();
    if (ref!=null)
    {
         ref.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 if (dataSnapshot.exists())
                 {
                     list = new ArrayList<>();
                     for(DataSnapshot ds : dataSnapshot.getChildren())
                     {

                         list.add(ds.getValue(Model.class));
                     }
                     ViewHolder viewHolder = new ViewHolder(list);
                     recyclerView.setAdapter(viewHolder);
                 }

             }

             @Override
             public void onCancelled(@NonNull DatabaseError databaseError) {
                 Toast.makeText(ViewProduct.this, databaseError.getMessage(),
                         Toast.LENGTH_SHORT).show();
             }
         });
    }

这是 ViewHolder 类。

ArrayList<Model> list;
    public ViewHolder (ArrayList<Model> list)
    {
        this.list=list;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_product,
                viewGroup,false);


        return new MyViewHolder(view);


    }

【问题讨论】:

标签: android android-recyclerview adapter


【解决方案1】:

oncreate() 中使用空的data 设置适配器,在fetching 数据之后,您应该调用adapter.notifyDataSetChanged(),如下所示。

ViewHolder viewHolder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_product)  ;

    ref = FirebaseDatabase.getInstance().getReference().child("buddymealplanneruser").child("Products");
    recyclerView = findViewById(R.id.stallproductRecyclerView);

    //newest
    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(manager);
    recyclerView.setHasFixedSize(true);
    //
    searchView = findViewById(R.id.searchProductStall);

    // here you have to set the adapter to your recycler view
    list = new ArrayList<>();
    viewHolder = new ViewHolder(list);
    recyclerView.setAdapter(viewHolder);

}

@Override
protected void onRestart() {
    super.onRestart();
    if (ref!=null)
    {
         ref.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 if (dataSnapshot.exists())
                 {
                     // clear your previous data
                     list.clear();
                     for(DataSnapshot ds : dataSnapshot.getChildren())
                     {
                         list.add(ds.getValue(Model.class));
                     }
                     // here you have to notify you adapter that your data set is changed like below
                     viewHolder.notifyDataSetChanged();
                 }

             }

             @Override
             public void onCancelled(@NonNull DatabaseError databaseError) {
                 Toast.makeText(ViewProduct.this, databaseError.getMessage(),
                         Toast.LENGTH_SHORT).show();
             }
         });
    }

【讨论】:

  • 非常感谢您尝试我。代码太多,但到目前为止没有一个对我有帮助。谢谢
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2020-03-12
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多