Java 如何在onDataChange中填充ArrayList,ArrayList用于更新适配器

Java 如何在onDataChange中填充ArrayList,ArrayList用于更新适配器,java,firebase,firebase-realtime-database,android-asynctask,asynccallback,Java,Firebase,Firebase Realtime Database,Android Asynctask,Asynccallback,我陷入了一种情况,我必须通过FirebaseRealtimeDatabase获取populate ArrayList,现在它返回一个ViewHolder,但由于onDataChange是异步的,在onDataChange完成数据填充之前调用getItemSize,导致它返回0,因此永远不会调用onCreateViewHoldwer。如何使适配器等待从onDataChange获取所有数据,或者通知适配器需要刷新?? 注意:这一切都发生在适配器类内部 我尝试实现一个回调,但该回调也是在getItem

我陷入了一种情况,我必须通过FirebaseRealtimeDatabase获取populate ArrayList,现在它返回一个ViewHolder,但由于onDataChange是异步的,在onDataChange完成数据填充之前调用getItemSize,导致它返回0,因此永远不会调用onCreateViewHoldwer。如何使适配器等待从onDataChange获取所有数据,或者通知适配器需要刷新?? 注意:这一切都发生在适配器类内部

我尝试实现一个回调,但该回调也是在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()

}不能让适配器等待异步操作。您可以暂停创建适配器,从而将加载数据的代码移到适配器外部,或者让适配器处理异步加载数据的事实

后一种方法是在数据加载时通知适配器:

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

当我使用您的代码时,适配器并没有名为notifyDataSetChanged的方法,它有notify?我在populateLisy中声明adapter,我是否犯了一些错误?看看我们是否通过向main Activity发送回调来执行相同的操作,此方法是否有一些优势?我看到您接受了我的答案,因此,假设您发现了回调和notifyDataSetChanged之间的区别:后者通知适配器它需要重新绘制其所连接的任何视图。