java - 更改 ListView 中单个 View 的外观

标签 java android android-layout listview

我正在开发一个音乐应用程序。我想粗体显示当前正在播放的歌曲的信息(例如 Google Play 音乐)。有一个包含所有歌曲的 ListView,由每首歌曲的歌曲信息的相对布局填充。通过单击 ListView(可以播放任何歌曲)或按上一首或下一首(将播放相邻歌曲)来播放歌曲。

我不想使用 ScrollView,因为歌曲库可能有大量要显示的条目。

我需要能够

  • 根据给定位置编辑 View ,该位置可能在屏幕外
  • 无论某个特定 View 是否在屏幕上,都将其保持为粗体(例如,我无法将 View 默认为 Typeface.NORMAL,因为滚动并返回歌曲会重置它)
  • 播放结束后将之前播放的歌曲恢复正常

我查看了GPM源代码here但我不知道它在哪里做到这一点。任何帮助将不胜感激:)

最佳答案

无论您使用 ListView 还是 RecyclerView,解决方案的通用模板都是相同的:您应该存储对 (a) “当前“正在播放”索引或 (b)“当前正在播放”数据项。

让我们看看如果您使用 ListView 并保存“当前播放”索引,解决方案是什么。

第一步是使用一些变量来保存当前正在播放的内容。也许您使用 int 并将特殊值 -1 视为表示没有任何内容正在播放。

private int currentlyPlayingPosition;

每当您更改当前正在播放的歌曲时,您都会更新此处存储的值(当用户按下“下一首歌曲”等时,可能会更新++currentlyPlayingPosition)。然后,您还必须调用 adapter.notifyDataSetChanged() 来告诉 ListView 重新绘制自身,以便粗体歌曲发生变化。

在您的 getView() 方法中,您可以检查您正在绘制的 View 是否是“当前播放”的歌曲,并据此更改字体:

@Override
public View getView(int position, View convertView, ViewGroup container) {
    ...
    if (position == currentlyPlayingPosition) {
        textView.setTypeface(textView.getTypeface(), Typeface.BOLD);
    } else {
        textView.setTypeface(textView.getTypeface(), Typeface.NORMAL);
    }
    ...
}

整体步骤比较简单:

  • 跟踪当前正在播放的歌曲(通过索引、对象引用或其他方式)
  • 每当当前播放的歌曲发生变化时,通知适配器
  • getView() 中检查您显示的歌曲是否是当前正在播放的歌曲,如果是,则显示特殊的 UI

关于java - 更改 ListView 中单个 View 的外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124114/

相关文章:

android - 删除线程 Toast 消息

android - android.widget.ExpandableListView 中的分组指示器

Android 相对布局缩放和对齐

java - LWUIT画家: How to make an image the background?

java - Webapp与Applet的交互

java - 在 gwt 中调度传入的 RPC 调用时出现异常

android - 如何在多行TextView的末尾插入ImageView?

android - BroadcastReceiver 中的 postDelayed

java - 使用 java 从 Google Drive 下载 Google Docs 文件

android - 禁用布局中的所有元素 - Android