首页 > 解决方案 > Android JAVA中MVP模式中的Firestore数据提取序列

问题描述

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

我在 Firestore 中运行存储库部分的顺序有问题。我已设置首先运行我的 Fetch 数据功能,然后更新视图以在演示者中进行界面。但是,结果是它先完成更新视图,然后获取数据。我不确定我的代码有什么问题。

我有我的看法

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

}

我的主持人

public class Presenter {

    private Repository Spot;
    private View view;
    public Presenter (View view) {

        this.Spot = new Repository();
        this.view = view;

    }

    public void GetActivityList(){
        Spot.getFullActivityList();
        view.UpdateActivityList(Spot.toArray());

    }


    public interface View{

        void UpdateActivityList(ArrayList<Activity> ActivityList);

    }

}

我的仓库

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;

    }

}

基于上述编码,最后运行“Ref.document("uid").get()”部分。结果,我无法用数据刷新视图。对我所做的改变有什么想法吗?我的“Adapter.notifyDataSetChanged();”有什么问题吗?

标签: androidgoogle-cloud-firestoreandroid-mvp

解决方案


你做错了回调。您的 firebase 回调基本上是另一个线程。然后在您调用 view.UpdateActivityList() 之后更新数据。要解决此问题,您必须创建一种方法来通知您的 Presenter 您的 Repo 具有更新的数据。然后 Presenter 将更新视图。

  1. public void GetActivityList(){
    Spot.getFullActivityList();
    view.UpdateActivityList(Spot.toArray()); -> Remove this. 
    

    }

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

    接口 onDataUpdateListener(){

    void onDataUpdated(Your list);
    

    }

  3. 当 repo 完成任务时通知您的演示者。

     @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)
           }
    
  4. 当你初始化你的回购时设置监听器

    公共存储库(您的听众){

    }

  5. 在 Presenter 中实现监听器。

    Presenter 实现 onDataUpdateListener { }


推荐阅读