How to clear data from ViewModel ?MVVM [closed]

让人想犯罪 __ 提交于 2020-08-10 22:54:07

问题


Is there any way to clear/delete all data stored using MVVM pattern?
My app looks like
Login Activity -> Main Activity -> fragments(each fragment: Firebase singleton +repository singleton+view model + view)
All the data is stored as livedata and when I logout and login with a different account the data is from previous one

fragment example:

PopularTagsFirebase

public class PopularTagsFirebase implements PopularTagsFirebaseDao {
    private static PopularTagsFirebase instance = null;
    private ArrayList<PopularTagsObject> popularTagsList = new ArrayList<>();
    private MutableLiveData<List<PopularTagsObject>> result = new MutableLiveData<List<PopularTagsObject>>();

    public static synchronized PopularTagsFirebase getInstance() {
        if (instance == null) {
            Log.d("PopularTagsMVVM", "FB Firebase getInstance: ");
            instance = new PopularTagsFirebase();
            instance.loadDataFromDb();
        }
        return instance;
    }

    private void loadDataFromDb() {
        Log.d("PopularTagsMVVM", "FB getAllPopularTags: ");
        DatabaseReference tagsDatabase = FirebaseDatabase.getInstance().getReference().child("Tags");
        //real time update
        tagsDatabase.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                String tag_name = snapshot.getKey();
                int tag_popularity = (int) snapshot.getChildrenCount();
                PopularTagsObject popular_tag = new PopularTagsObject(tag_name, tag_popularity);
                popularTagsList.add(popular_tag);
                result.postValue(popularTagsList);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                String tag_name = snapshot.getKey();
                int tag_popularity = (int) snapshot.getChildrenCount();
                PopularTagsObject popular_tag = new PopularTagsObject(tag_name, tag_popularity);
                for (int i = 0; i < popularTagsList.size(); i++) {
                    if (popularTagsList.get(i).getTagName().equals(popular_tag.getTagName())) {
                        popularTagsList.remove(i);
                    }
                }
                popularTagsList.add(popular_tag);
                result.postValue(popularTagsList);
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {
                Log.d("PopularTagsMVVM", "FB onChildRemoved: ");
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                Log.d("PopularTagsMVVM", "FB onChildMoved: ");
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }

    @Override
    public MutableLiveData<List<PopularTagsObject>> getAllPopularTags() {
        return result;
    }

PopularTagsRepository

public class PopularTagsRepository {
    private static LiveData<List<PopularTagsObject>> allPopularTags;
    private static PopularTagsRepository instance = null;

    public static synchronized PopularTagsRepository getInstance() {
        if (instance == null) {
            instance = new PopularTagsRepository();
        }
        return instance;
    }

    public LiveData<List<PopularTagsObject>> getAllPopularTags() {
        allPopularTags = new PopularTagsFirebase().getInstance().getAllPopularTags();
        return allPopularTags;
    }
}

PopularTagsFragmentViewModel

public class PopularTagsFragmentViewModel extends AndroidViewModel {
    private PopularTagsRepository popularTagsRepository;
    private LiveData<List<PopularTagsObject>> allPopularTags;

    public PopularTagsFragmentViewModel(@NonNull Application application) {
        super(application);
        popularTagsRepository = new PopularTagsRepository().getInstance();
        allPopularTags = popularTagsRepository.getAllPopularTags();
    }

    public LiveData<List<PopularTagsObject>> getAllPopularTags() {
        allPopularTags = Transformations.map(allPopularTags, list -> sortCollection(list));
        return allPopularTags;
    }

    public List<PopularTagsObject> sortCollection(List<PopularTagsObject> popularTagsList) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Collections.sort(popularTagsList, Comparator.comparing(PopularTagsObject::getTagPopularity).reversed());
        } else {
            Collections.sort(popularTagsList, new Comparator<PopularTagsObject>() {
                public int compare(PopularTagsObject o1, PopularTagsObject o2) {
                    if (o1.getTagPopularity() == o2.getTagPopularity())
                        return 0;
                    return o1.getTagPopularity() < o2.getTagPopularity() ? -1 : 1;
                }
            });
            Collections.reverse(popularTagsList);
        }
        return popularTagsList;
    }
}

PopularTagsFragment

  @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        PopularTagsFragmentViewModel popularTagsFragmentViewModel = new ViewModelProvider(this).get(PopularTagsFragmentViewModel.class);
        RecyclerView popularTagsRecyclerView = getView().findViewById(R.id.popularTagsRecyclerView);
        ArrayList<PopularTagsObject> arrayList = new ArrayList<>();
        popularTagsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
        PopularTagsAdapter tagsPopularAdapter = new PopularTagsAdapter(getContext(), arrayList);
        popularTagsRecyclerView.setAdapter(tagsPopularAdapter);
        popularTagsFragmentViewModel.getAllPopularTags().observe(getActivity(), new Observer<List<PopularTagsObject>>() {
            @Override
            public void onChanged(List<PopularTagsObject> popularTagsObjects) {
                arrayList.clear();
                arrayList.addAll(popularTagsObjects);
                tagsPopularAdapter.notifyDataSetChanged();
            }
        });
    }

来源:https://stackoverflow.com/questions/63210752/how-to-clear-data-from-viewmodel-mvvm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!