Как заполнить ArrayList внутри onDataChange, используя arraylist для обновления Adapter - PullRequest
0 голосов
/ 04 мая 2020

Я застрял в ситуации, мне нужно заполнить ArrayList с помощью FirebaseRealtimeDatabase, теперь это возвращает ViewHolder, но, поскольку onDataChange является Asynchronous, вызов getItemSize () выполняется до того, как onDataChange завершил заполнение данных, что приводит к возврату 0, и, следовательно, onCreateViewHoldwer никогда не вызывается. Как заставить Adapter ждать, пока будут извлечены все данные из onDataChange, или же уведомить Adapter о необходимости обновления sh ?? Примечание: все это происходит внутри класса Adapter.

Я пытался реализовать обратный вызов, но этот обратный вызов также вызывается после getItemSize ()

Вот минимизированное выделение моего кода

public class SubjectAdapter extends RecyclerView.Adapter<SubjectHolder> {
public interface MyCallback{
    void onCallback(Subjects s);
}
//declarations


public SubjectAdapter(Context context) {
    //initialisations
    populateList(new MyCallback() {
        @Override
        public void onCallback(Subjects s) {
            subjectsArrayList.add(s);
            Log.e("callback",s.toString());
        }
    });
    mContext=context;
}

public void populateList(final MyCallback myCallback){
    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);
                        myCallback.onCallback(s);
                        //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) {
    //something
}

@Override
public void onBindViewHolder(@NonNull SubjectHolder holder, int position) {
//something

}


@Override
public int getItemCount()

}

1 Ответ

1 голос
/ 04 мая 2020

Нельзя заставить адаптер ждать асинхронную операцию. Вы можете отложить создание адаптера (и, таким образом, переместить код, который загружает данные за пределы адаптера), или заставить адаптер обрабатывать тот факт, что его данные загружаются асинхронно.

Последнее, что вы делаете с помощью уведомление адаптера при загрузке данных:

SubjectAdapter adapter = this;
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);
                    myCallback.onCallback(s);
                }
                adapter.notifyDataSetChanged();
            }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...