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。
public void GetActivityList(){
Spot.getFullActivityList();
view.UpdateActivityList(Spot.toArray()); -> Remove this.
}
在您的演示器中创建新界面以从您的 Repo 获取更新:
接口 onDataUpdateListener(){
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)
}
在初始化 Repo 时设置监听器
public 存储库(您的听众){
}
在 Presenter 中实现侦听器。
Presenter 实现 onDataUpdateListener {
}
我是 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。
public void GetActivityList(){ Spot.getFullActivityList(); view.UpdateActivityList(Spot.toArray()); -> Remove this.
}
在您的演示器中创建新界面以从您的 Repo 获取更新:
接口 onDataUpdateListener(){
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) }
在初始化 Repo 时设置监听器
public 存储库(您的听众){
}
在 Presenter 中实现侦听器。
Presenter 实现 onDataUpdateListener { }