Android Studio - java - в onBindViewHolder, разрывы строк и пробелы добавляются в RecyclerView

Описание: Я столкнулся с проблемой в моем приложении для Android. У меня есть List заголовков текстовых документов. Нажатие на один item в list открывает текстовый документ в RecyclerView — документ загружается в TextView. Затем пользователь может провести TextView влево, чтобы загрузить следующий item (следующий текстовый документ) или вправо, чтобы просмотреть предыдущий item (предыдущий текстовый документ) внутри List. ПРИМЕЧАНИЕ. На данном этапе разработки приложения я не реализовал логику пролистывания в коде. Я обнаружил, что RecyclerView добавляет пробелы/переносы строк следующим образом, используя List с 15 элементами:

  • Если я нажму на первый элемент в list, текстовый документ откроется без каких-либо дополнительных пробелов вверху RecyclerView - это то, что я хочу - однако в конце элемента есть ~ 14 разрывов строк - лишние пробелы нет в текстовом документе
  • Если я нажму на item в середине списка, скажем, на элемент № 8, над текстовым документом будет 7 разрывов строк, а в конце будет добавлено 7 дополнительных разрывов строк.
  • Если я нажму на последний item в списке, в верхнюю часть документа будет добавлено примерно 14 разрывов строк, однако в конец текста дополнительные разрывы строк не будут добавлены.
  • Выполняю тест с 15 itemList's, однако, если я создаю новый List с одним item (один текстовый документ), этот документ открывается отлично, и над или под текстом файла нет лишнего места.
  • Для моего list из 15 items при нажатии на первый item не остается пустого пространства сверху и все пустое пространство внизу. Для моего list из 15 items при нажатии на последний item в list все пустое пространство оказывается сверху, а внизу пустого пространства нет, текст заканчивается и прокрутка останавливается соответствующим образом.

Использование операторов журнала: Когда я прокручиваю список вниз, метод onBindViewHolder() вызывается несколько раз, и если я rem вывожу «очищающий» код:

//holder.bind("");

Кажется, к элементам добавлены дополнительные разрывы строк. Кроме того, при прокрутке вверх дополнительные разрывы строк сохраняются, и теперь появляется несколько итераций одного и того же текстового документа item с увеличением количества пробелов. Таким образом, без кода holder.bind("");RecyclerView динамически добавляет итерации текстового документа, когда я прокручиваю страницу вверх и вниз.

Я пробовал следующие подходы для решения этой проблемы, но ни один из них не сработал:

  • Убедились, что логика внутри onBindViewHolder() эффективна и не выполняет лишних операций.

  • Проверено, что моя реализация ViewHolder правильно перерабатывает просмотры. и обновляет их содержимое новыми данными

  • Проверено соответствие данных и надлежащим образом уведомлено адаптеру о любых меняется с помощью notifyDataSetChanged().

  • В onBindViewHolder перенесена моя условная логика, поэтому я сбросил TextView for every item`

  • У меня есть cleaned project и rebuilt project, но это не влияет на проблему

Вот мой onBindViewHolder() метод:

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Log.d("SteList", "(SongLyricsAdapter) - line #83 - onBindViewHolder called");
        Songs song = dbHelper.getSongDetailsById((int) songsList.get(position).getSongId());
        if (position == selectedSongPosition) {
            // Load the lyrics of the selected song
            String songURI = song.getSongURI();
            String songFileName = song.getSongFileName();
            String lyrics = loadSongLyrics(context, songURI, songFileName);
            
            // Reset TextView state
            holder.lyricsTextView.setText(""); // Clear previous text
            holder.lyricsTextView.setScrollY(0); // Scroll to the top

            // Trim and set the lyrics
            String trimmedLyrics = lyrics.trim();
            holder.bind(trimmedLyrics);

        } else {
            // Clear the lyrics for other positions
            holder.bind("");
        }
    }

Вот xml, который раздувает и отображает текст:

<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
    android:id = "@+id/lyricsTextView"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:text = "Song Content"
    android:textSize = "16sp"
    android:padding = "16dp" />

Буду признателен за любые идеи или предложения о том, как решить эту проблему. Возможно, мне придется предоставить больше кода — предложите, что еще может быть полезно.

Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось «исправить» или, возможно, лучше «обойти» это, отправив другой объект в RecyclerViewadapter. Имея проблему с лишним пробелом, я отправлял array из Songs объектов, и хотя я фильтровал только тот Songs объект, на который щелкнул пользователь, RecyclerView добавлял дополнительные строки в view, таким образом отмечая песни в List, хотя одновременно следует загружать только один. Чтобы обойти эту проблему, я теперь отправляю только одну песню за раз, и это работает нормально.

Вот мой обновленный метод onBindViewHolder:

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        // Fetch the details of the selected song using the songId
        Songs song = dbHelper.getSongDetailsById(songId);

        // Load the lyrics of the selected song
        String songURI = song.getSongURI();
        String songFileName = song.getSongFileName();
        String lyrics = loadSongLyrics(context, songURI, songFileName);

        // Reset TextView state
        holder.lyricsTextView.setText(""); // Clear previous text
        holder.lyricsTextView.setScrollY(0); // Scroll to the top

        // Trim and set the lyrics
        String trimmedLyrics = lyrics.trim();
        holder.lyricsTextView.setText(trimmedLyrics);

    }

Итак, я все еще использую RecyclerView и отмечаю Songs, однако чувствую, что мне все еще чего-то не хватает... или, возможно, нет. Я оставлю это здесь, поскольку именно это вернуло меня к кодированию и завершению этого раздела приложения.

Спасибо за прочтение и удачи вам!

Другие вопросы по теме