From a3fb878f46c4f67da7843e986378c562d0eeb455 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Tue, 1 Feb 2022 10:01:59 +0800 Subject: [PATCH] set rv items and notify change in the same thread (#1595) to avoid inconsistency --- .../lsposed/manager/adapters/ScopeAdapter.java | 8 ++++---- .../manager/ui/fragment/ModulesFragment.java | 11 +++++------ .../manager/ui/fragment/RepoFragment.java | 18 +++++++++++------- .../manager/ui/fragment/RepoItemFragment.java | 14 ++++++++++---- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index a515dcf9..a1710932 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -219,8 +219,9 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter list, boolean loaded) { fragment.runOnUiThread(() -> { + if (list != null) showList = list; isLoaded = loaded; notifyDataSetChanged(); }); @@ -466,7 +467,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter) results.values; - setLoaded(true); + setLoaded((List) results.values, true); } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java index e9a13048..1fd1f0bf 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java @@ -52,7 +52,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.widget.SearchView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.navigation.NavOptions; import androidx.recyclerview.widget.LinearLayoutManager; @@ -668,7 +667,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi public void fullRefresh() { runAsync(() -> { - setLoaded(false); + setLoaded(null, false); moduleUtil.reloadInstalledModules(); refresh(); }); @@ -678,7 +677,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi var modules = moduleUtil.getModules(); if (modules == null) return; Comparator cmp = AppHelper.getAppListComparator(0, pm); - setLoaded(false); + setLoaded(null, false); var tmpList = new ArrayList(); modules.values().parallelStream() .sorted((a, b) -> { @@ -719,8 +718,9 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi }; @SuppressLint("NotifyDataSetChanged") - private void setLoaded(boolean loaded) { + private void setLoaded(List list, boolean loaded) { runOnUiThread(() -> { + if (list != null) showList = list; isLoaded = loaded; notifyDataSetChanged(); }); @@ -778,8 +778,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi @Override protected void publishResults(CharSequence constraint, FilterResults results) { //noinspection unchecked - showList = (List) results.values; - setLoaded(true); + setLoaded((List) results.values, true); } } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java index cd27b69b..450a55f3 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java @@ -19,6 +19,7 @@ package org.lsposed.manager.ui.fragment; +import android.annotation.SuppressLint; import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; @@ -325,14 +326,18 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene return showList.size(); } - private void setLoaded(boolean isLoaded) { - this.isLoaded = isLoaded; - runOnUiThread(this::notifyDataSetChanged); + @SuppressLint("NotifyDataSetChanged") + private void setLoaded(List list, boolean isLoaded) { + runOnUiThread(() -> { + showList = list; + this.isLoaded = isLoaded; + notifyDataSetChanged(); + }); } public void setData(Collection modules) { if (modules == null) return; - setLoaded(false); + setLoaded(null, false); int sort = App.getPreferences().getInt("repo_sort", 0); boolean upgradableFirst = App.getPreferences().getBoolean("upgradable_first", true); ConcurrentHashMap upgradable = new ConcurrentHashMap<>(); @@ -356,7 +361,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene public void fullRefresh() { runAsync(() -> { - setLoaded(false); + setLoaded(null, false); repoLoader.loadRemoteData(); refresh(); }); @@ -422,8 +427,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene @Override protected void publishResults(CharSequence constraint, FilterResults results) { //noinspection unchecked - showList = (List) results.values; - setLoaded(true); + setLoaded((List) results.values, true); } } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java index 7a37ad88..feea9b41 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java @@ -19,6 +19,7 @@ package org.lsposed.manager.ui.fragment; +import android.annotation.SuppressLint; import android.app.Dialog; import android.content.res.Resources; import android.graphics.Color; @@ -356,23 +357,28 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoLis runAsync(this::loadItems); } + @SuppressLint("NotifyDataSetChanged") public void loadItems() { var channels = resources.getStringArray(R.array.update_channel_values); var channel = App.getPreferences().getString("update_channel", channels[0]); var releases = module.getReleases(); + List tmpList; if (channel.equals(channels[0])) { - this.items = releases.parallelStream().filter(t -> { + tmpList = releases.parallelStream().filter(t -> { if (t.getIsPrerelease()) return false; var name = t.getName().toLowerCase(LocaleDelegate.getDefaultLocale()); return !name.startsWith("snapshot") && !name.startsWith("nightly"); }).collect(Collectors.toList()); } else if (channel.equals(channels[1])) { - this.items = releases.parallelStream().filter(t -> { + tmpList = releases.parallelStream().filter(t -> { var name = t.getName().toLowerCase(LocaleDelegate.getDefaultLocale()); return !name.startsWith("snapshot") && !name.startsWith("nightly"); }).collect(Collectors.toList()); - } else this.items = releases; - runOnUiThread(this::notifyDataSetChanged); + } else tmpList = releases; + runOnUiThread(() -> { + items = tmpList; + notifyDataSetChanged(); + }); } @NonNull