android - 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();”有什么问题吗?
解决方案
你做错了回调。您的 firebase 回调基本上是另一个线程。然后在您调用 view.UpdateActivityList() 之后更新数据。要解决此问题,您必须创建一种方法来通知您的 Presenter 您的 Repo 具有更新的数据。然后 Presenter 将更新视图。
public void GetActivityList(){ Spot.getFullActivityList(); view.UpdateActivityList(Spot.toArray()); -> Remove this.
}
在您的演示者中创建新界面以从您的回购中获取更新:
接口 onDataUpdateListener(){
void onDataUpdated(Your list);
}
当 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) }
当你初始化你的回购时设置监听器
公共存储库(您的听众){
}
在 Presenter 中实现监听器。
Presenter 实现 onDataUpdateListener { }