Описание:
Я столкнулся с проблемой в моем приложении для Android. У меня есть List заголовков текстовых документов. Нажатие на один item в list открывает текстовый документ в RecyclerView — документ загружается в TextView. Затем пользователь может провести TextView влево, чтобы загрузить следующий item (следующий текстовый документ) или вправо, чтобы просмотреть предыдущий item (предыдущий текстовый документ) внутри List. ПРИМЕЧАНИЕ. На данном этапе разработки приложения я не реализовал логику пролистывания в коде. Я обнаружил, что RecyclerView добавляет пробелы/переносы строк следующим образом, используя List с 15 элементами:
list, текстовый документ откроется без каких-либо дополнительных пробелов вверху RecyclerView - это то, что я хочу - однако в конце элемента есть ~ 14 разрывов строк - лишние пробелы нет в текстовом документеitem в середине списка, скажем, на элемент № 8, над текстовым документом будет 7 разрывов строк, а в конце будет добавлено 7 дополнительных разрывов строк.item в списке, в верхнюю часть документа будет добавлено примерно 14 разрывов строк, однако в конец текста дополнительные разрывы строк не будут добавлены.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" />
Буду признателен за любые идеи или предложения о том, как решить эту проблему. Возможно, мне придется предоставить больше кода — предложите, что еще может быть полезно.
Спасибо!




Мне удалось «исправить» или, возможно, лучше «обойти» это, отправив другой объект в 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, однако чувствую, что мне все еще чего-то не хватает... или, возможно, нет. Я оставлю это здесь, поскольку именно это вернуло меня к кодированию и завершению этого раздела приложения.
Спасибо за прочтение и удачи вам!