【问题标题】:How to retrieve latest played song?如何检索最新播放的歌曲?
【发布时间】:2017-11-19 06:08:35
【问题描述】:

我正在创建一个最近播放过歌曲的音乐播放器播放列表。我正在存储歌曲的数组列表和正在共享首选项中播放的歌曲的索引。我正在做的是从共享首选项中检索数组列表和歌曲索引并将其保存在另一个数组列表中。但问题是 recyclerView 一次只显示一首歌曲。

例如,如果我播放歌曲 A,recyclerView 应该在第一个位置显示歌曲 A,然后如果我播放歌曲 B,recyclerView 应该在第一个位置显示歌曲 B,在第二个位置显示歌曲 A。但它只显示第一个位置。

RecentlyPLayedsongs.java:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LayoutInflater inflater = LayoutInflater.from(this);
    View view6 = inflater.inflate(R.layout.activity_recently_played, null);
    FrameLayout container6 = (FrameLayout) findViewById(R.id.container);
    container6.addView(view6);

    recyclerView_recently_played = findViewById(R.id.recyclerView_recently_played);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView_recently_played.setLayoutManager(linearLayoutManager);

    StorageUtil storageUtil2 = new StorageUtil(getApplicationContext());

    SongList=storageUtil2.loadAudio();

    pos = storageUtil2.loadAudioIndex();

    songInfoModel = SongList.get(pos);

    RecentlyPlayedList.add(songInfoModel);

    adapter1 = new Playlist_Recently_Added_Adapter(RecentlyPlayedList, getApplicationContext());
    recyclerView_recently_played.setAdapter(adapter1);

}

【问题讨论】:

  • 这意味着您在播放歌曲 b 时添加到数组的第二个位置?
  • 我希望在播放歌曲 B 时将歌曲 A 添加到第二个位置,并将歌曲 B 添加到第一个位置,就像在普通音乐播放器中一样

标签: android arraylist android-recyclerview android-mediaplayer android-music-player


【解决方案1】:

您可以通过以下两种方式之一来做到这一点

  1. 在传递歌曲列表之前,您需要根据时间进行排序。在这种情况下,您还需要在播放歌曲时节省时间。(嗯,要实现这一点,您需要进行大量编码和维护)
  2. 这是更简单的方法。您可以使用数组列表的 add() 方法,您可以在那里指定位置以及下面的代码中提到的

    list.add(o, currentSong);

这里 0 被传递,这意味着每当您播放一首歌曲时,该歌曲将被添加到 0 索引处,这意味着您最近播放的歌曲将始终位于顶部。 希望对你有所帮助。

注意:我已经使用下面的代码验证了第二个解决方案,它可以按预期工作

List<Integer> list = new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);

    Log.d(TAG, "firs time");
    for (int a=0; a < list.size();a++ ) {
        Log.d(TAG, "" + list.get(a));
    }

    list.add(0,4);

    Log.d(TAG, "second time");
    for (int a=0; a < list.size();a++ ) {
        Log.d(TAG, "" + list.get(a));
    }

日志如下所述

11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: firs time
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 1
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 2
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 3
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: second time
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 4
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 1
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 2
11-19 11:24:53.400 3681-3681/com.example.awaheed.datetime D/test: 3

查看第二次在“0”索引处添加数字的日志,而不是在第一个位置,剩余的项目被向下推。希望这有点道理。

【讨论】:

  • 就像我说的,我使用了arraylist的add()方法,但是它只是将最新的歌曲添加到第一位,之前的歌曲在recyclerView下面没有显示。希望你明白我的意思。
  • 就像我提到的,我正在使用 add 方法,但如果您尝试这样做,您也会指定位置,您将在第一个位置添加您的歌曲,剩余的歌曲将自动推到第一首歌曲的下方。试试看。然后告诉我
  • 我以前试过。没有成功。只添加了歌曲。
  • 我已经测试过它工作正常,正如我在回答中提到的那样。我正在添加一段我测试过的代码,看看那个
  • 是的,我看到了,但在你的情况下它是一个整数值,但在我的情况下它是一个自定义对象。这段代码RecentlyPlayedList.add(songInfoModel);一次添加一首歌
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多