Riodevista
@Riodevista

Почему ListView медленно заполняется/отрисовывается?

Здравствуйте!
В приложении есть фрагмент со списком, который заполняется из базы данных с помощью SimpleCursorAdapter.
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        cursor = db.query(TABLE_NAME, null, null, null, null, null, null); // В коде непрямой вызов бд, но итог таков.
        ...
        scAdapter = new SimpleCursorAdapter(getActivity(), 
                            R.layout.rowlayout, cursor, from, to);
        ...
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_alarmclock, container, false);

        mListView = (AbsListView) view.findViewById(android.R.id.list);
        mListView.setAdapter(scAdapter);
        mListView.setOnItemClickListener(this);
        return view;
    }


В другом активити я добавляю элемент в базу данных
ContentValues cv = new ContentValues();
     cv.put("text", entTime.getText().toString());
      ...
 db.insert(TABLE_NAME, null, cv); // Тоже не вызывается напрямую.


Проблема такова:
Если добавить новый элемент в базу данных в соответствующем активити, то при возвращении в активити, где содержится фрагмент со списком, будет хорошо видна отрисовка некоторых полей списка (они плавно так появляются).
Экспериментально я установил следующие факты:
  • Если добавить элемент с пустыми полями, то эффекта плавного появления нет, пустые строки уже ждут нас при возвращении в фрагмент. Если добавить хотя бы одно поле с текстом, который будет выводиться в TextView в rowlayout.xml, то проблема возобновится.
  • Этот эффект появления виден не с определенного количества уже существующих строк в списке, а с области, которая этим строками занимается. То есть если наша новая строка попадает в нижнюю примерно половину экрана, то тогда с ней будет такой вот эффект замедленной отрисовки. Например, в списке есть уже 6 строк по 100dp в высоту, тогда добавим седьмую строку, её появление при возврате в фрагмент будет замедлено; добавим восьмую строку, тогда седьмая и восьмая строки вновь появятся замедленно. Если ничего не добавим, то все восемь строк моментально появятся. Теперь пусть у нас строки размером по 200dp, тогда всё начнёт повторяться примерно с четвёртой строки.


Напрашивается вывод, что не заполнение списка элементами происходит медленно, а его отрисовка, но разве список с одним текстовым полем в каждой строке требует больших ресурсов на это дело?

Творится что-то неясное, и я не могу понять, что именно :(

Заранее благодарю за любые мысли в слух по поводу.

UPD:
Если сделать кнопку в том же активити, где располагается фрагмент со списком, при нажатии на которую будет добавляться элемент в БД, и обновляться курсор адаптера, то все работает как часы.

UPD2:
Если возвращаться из нового активити кнопкой назад, то всё окей. Проблема только при возврате через кнопку "назад" в Action bar (getSupportActionBar().setHomeButtonEnabled(true);).
  • Вопрос задан
  • 2543 просмотра
Решения вопроса 1
Riodevista
@Riodevista Автор вопроса
Вдруг мой опыт пригодится следующим поколениям разработчиков.

Проблема была в том, что при возврате с помощью кнопки "вверх" в Action bar'е возникала анимация, заложенная в сам андроид: текущее окно "налетает" на пользователя и исчезает, а список плавно появляется сверху вниз. У меня же всё это выглядело рывками и неполноценно от того, что на девайсе была отключена вся анимация. Потому казалось, что проблемы именно со списком. А дергавшееся при возврате окно я списывал на другой баг, которые планировал решать позже.

Вот такая история. Остаётся открытым вопрос о том, как же избавиться от этой анимации в случае, если на девайся пользователя она отключена.

Определившаяся проблема решается здесь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
30 нояб. 2020, в 10:45
40000 руб./за проект
30 нояб. 2020, в 10:37
4000 руб./за проект
30 нояб. 2020, в 09:52
1 руб./за проект