Search code examples
androidandroid-recyclerviewadapter

No adapter attached; skipping layout : RecyclerView & Adapter


I have seen many answers regarding this issue, but nothing works for my coding.

I referred the codes based on this youtube videos and now I have this issue. Not sure how his code works and mine don't. Apparently I'm also new into this topic (RecyclerView).

This is my main activity :

@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();
             }
         });
    }

and this is ViewHolder class.

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);


    }

Solution

  • Set adapter in oncreate() with empty data and after fetching data you should call adapter.notifyDataSetChanged() like following.

    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();
                 }
             });
        }