Android JAVA中MVP模式下的Firestore数据提取序列
我是MVP架构师的新手,我正在我的应用程序中实现它。我首先从Firestore获取数据,然后将活动列表更新为片段中的适配器 我在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
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)
}