如何在不锁定UI或不显示加载图标的情况下将项目加载-充气到Recycler视图中?

时间:2019-05-10 23:05:32

标签: android-recyclerview

我只希望能够像在电话上的“联系人”本机应用程序中显示联系人列表一样(甚至不与服务器通信)。

我有1500个联系人,当我尝试加载回收器视图时,所有项目一次都滞后了2-3秒。

我已经实现了加载更多项目,但是有了加载栏,那不是我想要的。

我已经尝试过线程,执行器,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,我尝试加载每个项目并将其逐个通知给Background任务,希望它可以使项目快速且顺序地弹出,而不会干扰UI线程以不冻结屏幕。没用我现在没有选择了。我已经尝试了一切。

0 个答案:

没有答案