java - 如何重新加载从线程加载数据的recycleview
问题描述
在我的 android 应用程序中,我有recyclerView
一个fragment
. 因此,recyclerView
运营商会提供有关已安装应用程序的详细信息。我正在使用 acustomAdapter
并使用线程将数据加载到 ,recyclerView
因为如果不是 UI 挂起。我正在使用 swipetoReload 控件。我可以通过重新启动我使用的线程来重新加载 recylerView。但随后recyclerView
消失并立即再次出现。
我在这里做错了吗?有没有办法避免这种情况。或者有没有更好的方法没有线程或类似的东西。这是我的代码。
片段:
Thread loadApps = new Thread() {
@Override
public void run() {
swipeapplist.post(new Runnable() {
@Override
public void run() {
if (!swipeapplist.isRefreshing()) {
swipeapplist.setRefreshing(true);
}
}
});
appAdapter = new AppAdapter(context, getInstalledApps());
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
recyclerInstalledApps.post(new Runnable() {
@Override
public void run() {
recyclerInstalledApps.setLayoutManager(layoutManager);
LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(context, R.anim.recycler_layout_animation);
recyclerInstalledApps.setLayoutAnimation(controller);
recyclerInstalledApps.scheduleLayoutAnimation();
recyclerInstalledApps.setAdapter(appAdapter);
}
});
swipeapplist.post(new Runnable() {
@Override
public void run() {
if (swipeapplist.isRefreshing()) {
swipeapplist.setRefreshing(false);
}
}
});
}
};
loadApps.start();
获取应用信息的方法
private ArrayList<AppInfo> getInstalledApps() {
ArrayList<AppInfo> res = new ArrayList<>();
try {
if (context != null) {
pm = context.getPackageManager();
List<PackageInfo> packs = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
Collections.sort(packs, new Comparator<PackageInfo>() {
@Override
public int compare(PackageInfo arg0, PackageInfo arg1) {
CharSequence name0 = arg0.applicationInfo.loadLabel(pm);
CharSequence name1 = arg1.applicationInfo.loadLabel(pm);
return name0.toString().compareTo(name1.toString());
}
});
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((!isSystemPackage(p))) {
String appName = p.applicationInfo.loadLabel(context.getPackageManager()).toString();
String packageName = p.applicationInfo.packageName;
String appVersion = "Version : " + p.versionName;
Drawable icon = p.applicationInfo.loadIcon(context.getPackageManager());
res.add(new AppInfo(appName, packageName, appVersion, icon));
}
}
}
} catch (NullPointerException ex) {
ex.printStackTrace();
}
return res;
}
解决方案
尝试使用 notifyDataSetChanged
appAdapter = new AppAdapter(context, getInstalledApps());
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
recyclerInstalledApps.post(new Runnable() {
@Override
public void run() {
recyclerInstalledApps.setLayoutManager(layoutManager);
LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(context, R.anim.recycler_layout_animation);
recyclerInstalledApps.setLayoutAnimation(controller);
recyclerInstalledApps.scheduleLayoutAnimation();
recyclerInstalledApps.setAdapter(appAdapter);
}
});
appAdapter.notifyDataSetChanged();
推荐阅读
- google-analytics - 为什么我找不到我在数据源分析中使用的参数?
- .net - Angular7 Net2.2 信用卡处理应用
- angular - RxJS - 将发出的值映射到多个 Http 请求的组合输出
- wordpress - 将 Firebase 存储视频嵌入到 Wordpress 但隐藏 URL
- regex - 如何为此编写正则表达式?
- c++ - 链接到 CMake 目标会产生什么影响?
- root - Mojave 下 root 的“不允许操作”
- python - 在 python imgaug 库中,当对图像应用仿射变换时,如何将 cval 设置为 RGB?
- .net - VS 2017 - C# - 如何使用包连接到 DB2 db
- android - android初学者是否需要在android中使用MVVM模式或架构组件?