android-recyclerview - 如何在不锁定 UI 或显示加载图标的情况下加载 - 将项目充气到 Recycler 视图?
问题描述
我只想能够显示联系人列表(甚至无需与服务器通信),就像它在手机上的“联系人”本机应用程序上显示的方式一样。
我有 1500 个联系人,当我尝试加载回收站视图时,一次加载所有项目,它滞后了 2-3 秒。
我已经实现了加载更多项目,但有一个加载栏,这不是我想要的。
我已经尝试过 Threads、Executors、postOnUIThread()、handler.post() 甚至 AsyncTask -> Override -> doOnBackground。没有任何效果。
private class CustomTask extends AsyncTask<Void, Void, Void> {
int inserted;
@Override
protected Void doInBackground(Void... param) {
//Do some work
try {
lcf.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
((BaseActivity) lcf.getActivity()).showProgressDialog();
}
});
int currentSize = contactsLoaded.size();
for (inserted = 0; inserted < lcf.getController().getContacts().size() && contactsLoaded.size() < lcf.getController().getContacts().size(); inserted++) {
contactsLoaded.add(lcf.getController().getContacts().get(currentSize + inserted));
notifyItemRangeInserted(contactsLoaded.size() - 1, inserted);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void param) {
//Print Toast or open dialog
//notifyItemRangeInserted(contactsLoaded.size() - 1, 0);
if(!lcf.getController().isSelectedAffiliated()){
lcf.disclaimerLayout.setVisibility(View.VISIBLE);
}else{
lcf.disclaimerLayout.setVisibility(View.GONE);
}
lcf.isLoading=false;
((BaseActivity) lcf.getActivity()).hideProgressDialog();
}
}
该代码位于我的适配器中,“lcf”是对片段的引用。如果我使用保存在控制器上的已加载列表(我从片段引用中获得)然后只需调用 notifyDataSetChanged() 它就会像地狱一样滞后。因此,通过这个 CustomTask,我尝试加载每个项目并将其一一通知到后台任务,希望它可以使项目快速且按顺序弹出,而不会干扰 UI 线程以不冻结屏幕。它不起作用。我现在没有选择了。我什么都试过了。
解决方案
推荐阅读
- typescript - 所有 monorepo 包的单一 TypeScript 配置 + 编译命令
- mysql - 尝试嵌套查询时出现MYSQL Workbench错误
- php - 返回输入数字的错误值
- javascript - 在 Word Javascript API / Office.js 中创建跨越光标前字符的范围
- android-studio - Android工作室:字体没有颜色
- elasticsearch - 使用filebeat中的-E选项从命令行动态输入路径
- android - 错误:不是封闭类:MainActivity
- c# - 为什么 graphql-dotnet 会为此架构返回“预期的非空值”错误?
- javascript - 表单在提交时提交到 Textarea
- mysql - 图像无法在 laravel 的数据库中更新