Android Studio - java - 在 onBindViewHolder 中,将换行符和空白添加到 RecyclerView

问题描述 投票:0回答:1

描述: 我的 Android 应用程序遇到问题。我有

List
文本文档标题。单击
item
中的一个
list
将打开
RecyclerView
中的文本文档 - 文档加载到
TextView
中。然后,用户可以向左滑动
TextView
以加载下一个
item
(下一个文本文档),或向右滑动以查看
item
中的上一个
List
(上一个文本文档)。 注意:在我的应用程序开发中,目前我还没有在代码中实现滑动逻辑。 我发现
RecyclerView
添加了空格/换行符,如下所示,使用
List
包含 15 个项目:

  • 如果我单击
    list
    中的第一项,文本文档将打开,
    RecyclerView
    顶部没有任何额外的空白 - 这就是我想要的 - 但是在末尾有大约 14 个换行符项目 - 文本文档中没有额外的空白
  • 如果我单击列表中间的
    item
    ,例如项目#8,文本文档上方将有 7 个换行符,并且末尾会添加 7 个额外换行符
  • 如果我单击列表中的最后一个
    item
    ,文档顶部将添加大约 14 个换行符,但文本末尾不会添加额外的换行符
  • 使用 15
    item
    List's
    执行测试,但是如果我使用
    single
    List(单个文本文档)创建一个新的
    item
    ,则此文档可以完美打开,并且文件上方或下方没有任何额外空间文字
  • 对于我的 15 个
    list
    中的
    items
    ,单击第一个
    item
    顶部没有任何空白,底部全部空白。对于我的 15 个
    list
    中的
    items
    ,单击
    item
    中的最后一个
    list
    ,所有空白都在顶部,而底部不包含空白,文本结束并且滚动相应停止。

使用Log语句: 当我向下滚动列表时,

onBindViewHolder()
方法会被多次调用,如果我
rem
出“清除”代码:

//holder.bind("");

项目中似乎添加了额外的换行符。同样,在向后滚动时,额外的换行符仍然存在,并且现在出现同一文本文档的多次迭代

item
,并且空白量不断增加。因此,如果没有
holder.bind("");
代码,当我上下滚动页面时,
RecyclerView
会动态添加文本文档的迭代。

我尝试了以下方法来解决该问题,但没有任何效果:

  • 确保

    onBindViewHolder()
    内部逻辑高效且 不执行不必要的操作。

  • 验证我的

    ViewHolder
    实现正确回收视图 并用新数据更新其内容

  • 检查数据一致性并正确通知适配器任何情况 使用

    notifyDataSetChanged()
    进行更改。

  • onBindViewHolder
    中移动了我的条件逻辑,因此我重置了
    TextView for every 
    项目`

  • 我有

    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" />

如果您能提供有关如何解决此问题的任何见解或建议,我将不胜感激。我可能需要提供更多代码 - 请提出其他可能有帮助的代码。

谢谢!

java android android-studio android-recyclerview
1个回答
0
投票

我能够通过向

RecyclerView
adapter
发送不同的对象来“修复”或者更好地“解决”这个问题。虽然遇到额外空白的问题,但我发送了
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
上勾选,但是我觉得我仍然缺少一些东西......或者也许没有。我将把它留在这里,因为这让我回到编码并完成应用程序的这一部分。

感谢您的阅读,祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.