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
Data from Database is serialized correctly
At Point 1 Size is displayed correctly
At Point 2 Size is reset to 0