Vector
Vector

Reputation: 3235

Firebase Recycler View Adapter

We have a traditional ListView interfaced with a RecyclerView Adapter and a Model class. When we log in to Firebase we navigate to the ListView nothing is loaded in the ListView. We then go back to the login activity and repeat the process Then all the data is loaded from a very simple DB child node Table List We tired the Firebase RecyclerAdapter with no luck we may have had the wrong UI or version. Our question is why do we need to make two trips to the list view to load the data? We will post the ListView code NO Errors are generated We did try placing the code in an OnStart method no luck with that

        db = FirebaseDatabase.getInstance().getReference();
    dbRef = db.child("Table List");

    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot child : dataSnapshot.getChildren())
                listArrayList.add(child.getValue(String.class));
            sz = listArrayList.size();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    sz = listArrayList.size();

    if(sz == 0){
        tvNoData.setVisibility(View.VISIBLE);
        tvNoData.setText("No Quiz's Found\n\nClick On Make New Quiz");

        mRecyclerView = findViewById(R.id.recycleview);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new TableTrackerAdapter(this,listArrayList);
        mRecyclerView.setAdapter(mAdapter);
    }

    if(sz > 0){
        tvNoData.setVisibility(View.INVISIBLE);

        mRecyclerView = findViewById(R.id.recycleview);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new TableTrackerAdapter(this,listArrayList);
        mRecyclerView.setAdapter(mAdapter);

    }

Upvotes: 0

Views: 287

Answers (1)

Daiwik Dan
Daiwik Dan

Reputation: 195

The reason for that is because Firebase database is asynchronous, in other words the recyclerview is getting populated with an empty arraylist before firebase is finished loading data, I faced similar problem before.

Just move everything that depends on your arraylist inside firebase datachange, and the problem will be fixed like this.

public void setupRecyclerView(){

    if(sz == 0){
        tvNoData.setVisibility(View.VISIBLE);
        tvNoData.setText("No Quiz's Found\n\nClick On Make New Quiz");

        mRecyclerView = findViewById(R.id.recycleview);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new TableTrackerAdapter(MainActivity.this,listArrayList);
        mRecyclerView.setAdapter(mAdapter);
    }

    if(sz > 0){
        tvNoData.setVisibility(View.INVISIBLE);

        mRecyclerView = findViewById(R.id.recycleview);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new TableTrackerAdapter(MainActivity.this,listArrayList);
        mRecyclerView.setAdapter(mAdapter);

    }
}

db = FirebaseDatabase.getInstance().getReference();
dbRef = db.child("Table List");
dbRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot != null){
            for (DataSnapshot child : dataSnapshot.getChildren()){
                listArrayList.add(child.getValue(String.class));
            }
        sz = listArrayList.size();
        setupRecyclerView();
        }

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Upvotes: 2

Related Questions