ListView не прокручивается плавно при попытке использовать setText в onScroll

У меня есть RelativeLayout над моим ListView, и я ожидаю, что TextView в этом макете изменится в зависимости от содержимого первого видимого элемента ListView. Итак, я использую onScrollListener со своим списком:

@Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        if (adapter != null && adapter.getCount() > 0) {
            Transaction data = (Transaction) adapter.getItem(firstVisbileItem);
            Date date = data.getTransactionDate();
            date.setActualDate(date.getActualDate());
            String month = date.getMonthString(context);
            String year = date.getYear() + "";
            tvLeftValue.setText(month);
            tvRightValue.setText(year);
        }       
    }

Просто очень странно, что когда я использую это, список прокручивается очень медленно, но когда я попытался использовать setText("") для обоих TextView, список прокручивается плавно, как обычно. Эта проблема возникает, когда я тестирую на реальном устройстве (Galaxy S3), а не на эмуляторе Genymotion. Почему может возникнуть такая странная проблема? Есть ли какое-нибудь возможное решение для этого? Если кто-то из вас когда-либо сталкивался с этим, пожалуйста, помогите мне и спасибо заранее.

РЕДАКТИРОВАТЬ: На самом деле это также происходит в эмуляторе Genymotion, просто он быстрее, чем на реальных устройствах, поэтому я думал, что этого не произошло.


person huong    schedule 16.09.2013    source источник
comment
Вы получили какое-либо решение для этого или нашли обходной путь?   -  person Dittimon    schedule 18.06.2014
comment
@Dittimon на самом деле я не нашел хорошего решения для этого, поэтому мне пришлось переключиться на использование Удивительный ListView, чтобы сделать заголовки разделов для моего списка.   -  person huong    schedule 18.06.2014
comment
Возможно, вы просто устанавливаете этот способ слишком часто и вызываете ненужные перерисовки. Это может не сработать, но вы можете попробовать установить текст только в том случае, если он изменился.   -  person Gabe Sechan    schedule 01.07.2014


Ответы (2)


Метод onScorll вызывается очень часто. Вы слишком много делаете в основном потоке. Попробуйте использовать рабочий поток для выполнения вычислений и обработчик для обновления пользовательского интерфейса.

person Marco Lee    schedule 16.09.2013
comment
Спасибо, я пытался использовать AsyncTask, но это не улучшило ситуацию. Проблема в том, что я попытался закомментировать все строки, отвечающие за получение данных, и оставить setText со случайной строкой, но прокрутка по-прежнему медленная. - person huong; 16.09.2013

В итоге это решило аналогичную проблему, с которой я столкнулся: Использование

По сути, принятый ответ предполагает, что установка текста приводит к обновлению всего макета, поскольку TextView мог изменить размер.

Решение - исправить размер вашего textView. Вы по-прежнему можете использовать ширину в качестве родителя совпадения в зависимости от вашего макета.

<TextView
     android:layout_width="200dp"
     android:layout_height="32dp"
     android:ellipsize="end" />
person Dittimon    schedule 01.07.2014
comment
Также возможно было бы использовать относительный макет, в котором текстовое представление масштабируется, чтобы соответствовать между двумя элементами, что предотвратило бы его сжатие. - person Gabe Sechan; 01.07.2014