更改ListView中单个视图的外观

时间:2018-09-01 01:13:45

标签: java android android-layout listview

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

我不想使用ScrollView,因为歌曲库可能要显示很多条目。

我需要能够

  • 根据给定位置(可能不在屏幕上)编辑视图
  • 无论屏幕上是否显示某个视图,都将其加粗(例如,我无法将视图默认设置为Typeface.NORMAL,因为滚动并返回到歌曲会重置它)
  • 播放完成后将先前播放的歌曲恢复为正常

我已经查看了GPM源代码here,但我不知道它在哪里执行此操作。任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

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

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

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

private int currentlyPlayingPosition;

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

在您的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()内部,检查您显示的歌曲是否为当前播放的歌曲,如果是,则显示特殊的用户界面