Задать вопрос
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);).
  • Вопрос задан
  • 2586 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Riodevista
@Riodevista Автор вопроса
Вдруг мой опыт пригодится следующим поколениям разработчиков.

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

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

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

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

Похожие вопросы