首页 > 解决方案 > 如何在不锁定 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 线程以不冻结屏幕。它不起作用。我现在没有选择了。我什么都试过了。

标签: android-recyclerview

解决方案


推荐阅读