0

I have a SubjectAdapter which takes some data from FirebaseDatabase converts it into objects and populates a ViewHolder. I have tested other components of code and they are working perfectly.The problem seems to be in onDataChange. The subjectArrayList resets its size to zero after its execution finishes, just after calling the outer loop at Point 1 the changes persist resulting in size being positive but at Point 2 size is reset to 0, making getItemCount return zero and hence onCreateViewHolder is not called. Highlights of my code is

public class SubjectAdapter extends RecyclerView.Adapter<SubjectHolder> {
private final ArrayList<Subjects> subjectsArrayList=new ArrayList<Subjects>();
public   Context mContext;

private FirebaseDatabase firebaseDatabase;
private DatabaseReference databaseReference;
private DatabaseReference branchReference;
private DatabaseReference semesterInfoReference;


public SubjectAdapter(Context context) {
    firebaseDatabase=FirebaseDatabase.getInstance();
    databaseReference=firebaseDatabase.getReference();
    branchReference=databaseReference.child(Constants.STREAM_PATH);
    semesterInfoReference=databaseReference.child(Constants.SEMESTER_INFO);
    populateList();
    mContext=context;
}

public void populateList(){
    final ArrayList<String> units=new ArrayList<String>();

    semesterInfoReference.child("1").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot dsa:dataSnapshot.getChildren()) {
                    //Log.e("dsa",dsa.getValue().toString());
                    String subjectCode = dsa.getKey();
                    for(DataSnapshot ds:dsa.getChildren()) {
                        SubjectObj subjectObj = ds.getValue(SubjectObj.class);
                        units.add("Unit I");units.add("Unit II");
                        units.add("Unit III");units.add("Unit IV");
                        Subjects s = new Subjects(subjectObj.getProfessorName(), subjectCode, subjectObj.getSubjectName(), units);
                        subjectsArrayList.add(s);
                        //Log.e("subjectArrayLIst", subjectsArrayList.toString());
                    }

                }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    Log.e("holder", String.valueOf(subjectsArrayList.size()));

}
@Override
public void onBindViewHolder(@NonNull SubjectHolder holder, int position, @NonNull List payloads) {
    super.onBindViewHolder(holder, position, payloads);
}

@NonNull
@Override
public SubjectHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext());
    View cardView=layoutInflater.inflate(R.layout.activity_card,parent,false);
    SubjectHolder subjectHolder=new SubjectHolder(cardView,mContext);
    return subjectHolder;
}

@Override
public void onBindViewHolder(@NonNull SubjectHolder holder, int position) {
    Subjects subject=subjectsArrayList.get(position);
    Log.e("view",subjectsArrayList.get(position).toString());
    holder.setSubjectName(subject.getSubjectName());
    holder.setProfName(subject.getProfessor());
    holder.set_subjectCode(subject.getSubjectCode());
    holder.setUnitsGrid(subject.getUnits());

}


@Override
public int getItemCount() {
    Log.e("viewholder", String.valueOf(subjectsArrayList.size()));

    return subjectsArrayList.size();
}

}

Whats working

  1. Data from Database is serialized correctly

  2. At Point 1 Size is displayed correctly

  3. At Point 2 Size is reset to 0

AmanSharma
  • 821
  • 9
  • 15
  • Firebase API is asynchronous. So please check the duplicate to how can you solve this using a custom callback. – Alex Mamo May 04 '20 at 08:30
  • @AlexMamo I did that too, updated Populatelist to take a callback , but still, size is being returned zero, using Logs I can see callback is executed at last and async behaviour is still there. – AmanSharma May 04 '20 at 10:03

0 Answers0