Прокрутка RecyclerView зависает при просмотре длинного текста

#android #textview #android-recyclerview #charsequence

#Android #textview #android-recyclerview #последовательность символов

Вопрос:

Я пытаюсь реализовать макет в стиле раздела комментариев, используя RecyclerView . У меня есть список CharSequence объектов (каждый результат Html.fromHtml(String, null, null) ), которые я использую для заполнения этого RecyclerView .

Вот RecyclerView макет:

 <android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
 

Вот TextView макет:

 <TextView
    android:id="@ id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:lineSpacingMultiplier="1.4"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1"
    android:textIsSelectable="true"
    android:textSize="15sp"/>
 

Вот ViewHolder :

 public final class ItemHolder extends RecyclerView.ViewHolder {
    @Bind(R.id.text) TextView text; // ButterKnife

    public ItemHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        text.setMovementMethod(new LinkMovementMethod());
    }

    public void bind(CharSequence cs) {
        text.setText(cs);
    }
 

Остальное довольно стандартно. Задаются RecyclerView a LinearLayoutManager и an Adapter , которые считываются из списка и создают ViewHolder экземпляры. Я не звонил setHasFixedSize(true) , потому что хочу иметь возможность менять местами содержимое адаптера, и количество элементов не всегда может быть одинаковым.

Настройка работает для большинства входных данных, но проблема в том, что некоторые из CharSequence них имеют длину более 100 строк, и при прокрутке файл RecyclerView останавливается примерно на полсекунды непосредственно перед тем, как он дойдет до них, а затем продолжает прокрутку. Это происходит не только один раз. Когда я прокручиваю обратно до элемента, он снова зависает, а затем каждый раз, когда я прокручиваю элемент вне поля зрения и прокручиваю его обратно вниз, представление снова зависает. Как мне это исправить?

Комментарии:

1. как вы onBindViewHolder выглядите?

2. Никогда не рекомендуется использовать recyclerview для такой цели. Поскольку текст вашей строки (CharSequence) очень большой, для полного отображения требуется несколько микросекунд (или секунд), и это происходит со всеми представлениями экземпляров в видимой области (еще не переработанными). Быстрым решением может быть выгрузка части setText в другой фоновый поток, освобождая поток пользовательского интерфейса для свободного создания экземпляров. Также не размещайте много контента непосредственно в потоке пользовательского интерфейса.

3. @NileshSingh Как разгрузить settext фонового потока, держатель не позволяет изменять какие-либо данные, кроме потока пользовательского интерфейса, пожалуйста, приведите какой-нибудь пример или ссылку для этого.