Как я могу загрузить - накачать элементы в представление Recycler, не блокируя пользовательский интерфейс или не показывая значок загрузки? - PullRequest
0 голосов
/ 11 мая 2019

Я просто хочу иметь возможность отображать список контактов (даже без связи с сервером) так, как он отображается в собственном приложении "Контакты" на телефоне.

У меня как 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 (), это LAGS как ад. Таким образом, с помощью этой пользовательской задачи я пытался загрузить каждый элемент и уведомить его один за другим о фоновой задаче, надеясь, что это заставит элементы всплывать быстро и последовательно, не мешая потоку пользовательского интерфейса, чтобы не заморозить экран. Не работает У меня нет вариантов сейчас. Я перепробовал все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...