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

Firestore data extraction sequence in a MVP pattern in Android JAVA

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

我在 运行 在 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();

}

我的主持人

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();" 有问题吗?

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

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

    }

  2. 在您的演示器中创建新界面以从您的 Repo 获取更新:

    接口 onDataUpdateListener(){

    void onDataUpdated(Your list);
    

    }

  3. 回购完成任务时通知您的演示者。

     @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. 在初始化 Repo 时设置监听器

    public 存储库(您的听众){

    }

  5. 在 Presenter 中实现侦听器。

    Presenter 实现 onDataUpdateListener { }