changes to ArrayList Dont persist after for loop , inside onDataChange of Firebase Realtime Database

huangapple 未分类评论50阅读模式
英文:

changes to ArrayList Dont persist after for loop , inside onDataChange of Firebase Realtime Database

问题

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

            @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, the size is displayed correctly.
  3. At Point 2, the size is reset to 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&lt;SubjectHolder&gt; {
private final ArrayList&lt;Subjects&gt; subjectsArrayList=new ArrayList&lt;Subjects&gt;();
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&lt;String&gt; units=new ArrayList&lt;String&gt;();

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

                }

        }

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

        }
    });

    Log.e(&quot;holder&quot;, 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(&quot;view&quot;,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(&quot;viewholder&quot;, 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

huangapple
  • 本文由 发表于 2020年5月4日 16:21:37
  • 转载请务必保留本文链接:https://java.coder-hub.com/61587917.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定