我正在开发一个音乐应用程序。我想粗体显示当前正在播放的歌曲的信息(例如 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/