Android JAVA中MVP模式下的Firestore数据提取序列

Android JAVA中MVP模式下的Firestore数据提取序列,android,google-cloud-firestore,android-mvp,Android,Google Cloud Firestore,Android Mvp,我是MVP架构师的新手,我正在我的应用程序中实现它。我首先从Firestore获取数据,然后将活动列表更新为片段中的适配器 我在Firestore中运行存储库部件的顺序中遇到问题。我已设置先运行“获取数据”函数,然后在演示者中执行“更新视图到”接口。然而,结果表明它首先完成更新视图,然后获取数据。我不确定我的代码出了什么问题 我有我的看法 private ActivityAdapter ActivityAdapter; ArrayList<Activity> ActivityList

我是MVP架构师的新手,我正在我的应用程序中实现它。我首先从Firestore获取数据,然后将活动列表更新为片段中的适配器

我在Firestore中运行存储库部件的顺序中遇到问题。我已设置先运行“获取数据”函数,然后在演示者中执行“更新视图到”接口。然而,结果表明它首先完成更新视图,然后获取数据。我不确定我的代码出了什么问题

我有我的看法

private ActivityAdapter ActivityAdapter;
ArrayList<Activity> ActivityList = new ArrayList<>();
private SpotDetailPresenter SpotPresenter;

@Override
public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;

}

public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
      Presenter = new Presenter(this);
      final View root = inflater.inflate(R.layout.fragment_activity_list, container, false);
      RecyclerView recyclerView = root.findViewById(R.id.rvContainer);
      Presenter.GetActivityList();
      recyclerView.setHasFixedSize(true);
      recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
      recyclerView.setAdapter(ActivityAdapter);
      return root;

}

@Override
public void UpdateActivityList(ArrayList<Activity> newActivityList) {


        for (int i = 0 ; i<newActivityList.size();i++){

            ActivityList.add(newActivityList.get(i));

        }
        ActivityAdapter = new ActivityAdapter(ActivityList, mContext);
        ActivityAdapter.notifyDataSetChanged();

}
私有活动适配器活动适配器;
ArrayList ActivityList=新建ArrayList();
私人SpotDetailPresenter SpotPresenter;
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
mContext=上下文;
}
公共视图onCreateView(@NonNull layoutiner充气机,
视图组容器,捆绑包savedInstanceState){
演示者=新演示者(此);
最终视图根=充气机。充气(R.layout.fragment\u activity\u list,container,false);
RecyclerView RecyclerView=root.findViewById(R.id.rvContainer);
Presenter.GetActivityList();
recyclerView.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(mContext));
recyclerView.setAdapter(ActivityAdapter);
返回根;
}
@凌驾
public void UpdateActivityList(ArrayList newActivityList){

对于(int i=0;i您的回调做错了。firebase回调基本上是另一个线程。然后它会在您调用view.UpdateActivityList()后更新数据。若要解决此问题,您必须创建一种方法来通知演示者您的Repo已更新数据。然后演示者将更新视图

  • }

  • 在演示者内创建新界面以从您的回购中获取更新:

    接口onDataUpdateListener(){

    }

  • 回购完成任务时通知演示者

     @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
    
            if (task.isSuccessful()) {
    
                DocumentSnapshot document = task.getResult();
                Map<String, HashMap> root = (Map<String, HashMap>) document.get(Root);
                this.ActivityList.add(new Activity(root.getValue()));
             yourlisener.onDataUpdated(Your list)
           }
    
    @覆盖
    未完成的公共void(@NonNull任务){
    if(task.issusccessful()){
    DocumentSnapshot document=task.getResult();
    Map root=(Map)document.get(root);
    this.ActivityList.add(新活动(root.getValue());
    yourlisener.onDataUpdated(您的列表)
    }
    
  • 在初始化Repo时设置侦听器

    公共存储库(您的侦听器){

    }

  • 在演示者内部实现侦听器

    演示者实现onDataUpdateListener{ }


  • 谢谢。我可以澄清第4步吗?我应该在哪一点初始化Repo并设置侦听器?在View->onCreateView中?类似这样的内容:
    PublicPresenter(View视图){this.Spot=new Repository(this);//这意味着您的演示器将实现//YourListener this.View=View;}
    public class Repository_Spot {
    
        private CollectionReference Ref = Helper.getCheckinCollection();
    
        private ArrayList<Activity> ActivityList = new ArrayList<>();
    
    
        public Repository (){
    
        }
    
        public Repository(ArrayList<Activity> ActivityList){
            this.ActivityList = ActivityList;
    
        }
    
        public void getFullActivityList(){
    
            Ref.document("uid").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
    
                    if (task.isSuccessful()) {
    
                        DocumentSnapshot document = task.getResult();
                        Map<String, HashMap> root = (Map<String, HashMap>) document.get(Root);
                        this.ActivityList.add(new Activity(root.getValue()));
    
                    }
                }
    
            });
    
        }
    
        public ArrayList<Activity> toArray(){
    
            return ActivityList;
    
        }
    
    }
    
    public void GetActivityList(){
    Spot.getFullActivityList();
    view.UpdateActivityList(Spot.toArray()); -> Remove this. 
    
    void onDataUpdated(Your list);
    
     @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
    
            if (task.isSuccessful()) {
    
                DocumentSnapshot document = task.getResult();
                Map<String, HashMap> root = (Map<String, HashMap>) document.get(Root);
                this.ActivityList.add(new Activity(root.getValue()));
             yourlisener.onDataUpdated(Your list)
           }