Java 更改ListView中单个视图的外观
我正在开发一个音乐应用程序。我想加粗当前播放的歌曲的信息(例如谷歌播放音乐)。有一个所有歌曲的列表视图,由每首歌曲的歌曲信息的相对列表填充。通过单击ListView(可播放任何歌曲)或按previous或next(将播放相邻歌曲)播放歌曲 我不想使用ScrollView,因为歌曲库可能有大量的条目要显示 我需要能够Java 更改ListView中单个视图的外观,java,android,android-layout,listview,Java,Android,Android Layout,Listview,我正在开发一个音乐应用程序。我想加粗当前播放的歌曲的信息(例如谷歌播放音乐)。有一个所有歌曲的列表视图,由每首歌曲的歌曲信息的相对列表填充。通过单击ListView(可播放任何歌曲)或按previous或next(将播放相邻歌曲)播放歌曲 我不想使用ScrollView,因为歌曲库可能有大量的条目要显示 我需要能够 基于给定位置编辑视图,该位置可能在屏幕外 无论某个视图是否在屏幕上,都要将其保持为粗体(例如,我不能将视图默认为字体。正常,因为滚动到某首歌曲会将其重置) 播放完成后,将先前播放的
- 基于给定位置编辑视图,该位置可能在屏幕外
- 无论某个视图是否在屏幕上,都要将其保持为粗体(例如,我不能将视图默认为字体。正常,因为滚动到某首歌曲会将其重置)
- 播放完成后,将先前播放的歌曲恢复到正常状态
我看过GPM的源代码,但我不知道它是在哪里实现的。任何帮助都将不胜感激:)无论您使用的是
ListView
还是RecyclerView
,解决方案的通用模板都是相同的:您应该存储对(a)“当前播放”索引或(b)“当前播放”数据项的引用
让我们看看如果使用ListView
并保存“当前播放”索引,解决方案是什么
第一步是一些变量来保存当前播放的内容。可能您使用了一个int
,并将特殊值-1
视为没有播放任何内容
private int currentlyPlayingPosition;
无论何时更改当前播放的歌曲,都会更新存储在此处的值(当用户按“下一首歌曲”时,可能会更新存储在此处的值)。然后,您还必须调用适配器.notifyDataSetChanged()
来告诉列表视图重新绘制自身,以便粗体歌曲发生变化
在getView()
方法中,您可以检查正在绘制的视图是否为“当前播放”歌曲,并根据该歌曲更改字体:
@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()
内部检查您正在显示的歌曲是否是当前正在播放的歌曲,如果是,则显示特殊用户界面
使用a并保留当前播放歌曲的索引,当您重新绘制索引项时,请将文本加粗,以及您需要的其他内容。(RecyclerView甚至可能会记住状态,这意味着你可以使用事件和激发并忘记。我记不清它的行为了)