当前位置: 首页 > 知识库问答 >
问题:

如何刷新recyclerview?

颜瀚漠
2023-03-14

我用碎片制作了一个mediaplayer应用程序;歌曲、专辑、艺术家、流派、播放列表

这是我的一个片段中的代码,我将以艺术家为例

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_tab3, container, false);
    recyclerViewArtists = rootView.findViewById(R.id.recyclerViewArtists);

    initRecyclerView();

    return rootView;
}

private void initRecyclerView(){
    items = Main.songs.getArtists();

    if ((items != null) && (! items.isEmpty())) {
        adapter = new Adapter(getContext(), items);
        recyclerViewArtists.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerViewArtists.setHasFixedSize(true);
        recyclerViewArtists.setAdapter(adapter);
        Log.i(TAG, "Artists found in list!");

    recyclerViewArtists.addOnItemTouchListener(new OnItemClickListeners(getContext(), new OnItemClickListeners.OnItemClickListener() {
        @TargetApi(Build.VERSION_CODES.O)
        @Override
        public void onItemClick(View view, int position) {
            Toast.makeText(getContext(), "You Clicked position: " + position + " " + items.get(position) , Toast.LENGTH_SHORT).show();
            if (! Main.songs.isInitialized()){
                return;
            }
            String selectedArtist = items.get(position);

            Main.musicList = Main.songs.getSongsByArtist(selectedArtist);
            Intent intent = new Intent(getContext(), ListSongsActivity.class);
            intent.putExtra("title", selectedArtist);
            startActivity(intent);
        }
    }));

    }else{
        Log.i(TAG, "No artists found in list!");
    }
}

在我的initRecyClaire View()方法中,我有一个名为“项目”的数组列表,其中包含歌曲艺术家。Main.songs.get艺术家-

现在,当用户点击一个艺术家时,另一个活动将启动ListSong sActivity.java

这是类中的代码ListSong sActivity.java

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_songs_layout);

    //Holds all the songs in a scrollable list.
    recyclerViewListSongs = findViewById(R.id.recyclerViewListSongs);
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();

    // Connects the song list to an adapter
    // (thing that creates several Layouts from the song list)
    if ((Main.musicList != null) && (!Main.musicList.isEmpty())) {
        allSongsAdapter = new AllSongsAdapter(this, Main.musicList);
        recyclerViewListSongs.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recyclerViewListSongs.setHasFixedSize(true);
        recyclerViewListSongs.setAdapter(allSongsAdapter);
        allSongsAdapter.notifyDataSetChanged();
    }

    mToolbar = findViewById(R.id.mToolbar);
    setSupportActionBar(mToolbar);

    if ((getSupportActionBar() != null) && (bundle != null)) {
        getSupportActionBar().setTitle((String) bundle.get("title"));
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_home_up);
    }

    recyclerViewListSongs.addOnItemTouchListener(new OnItemClickListeners(getApplicationContext(), new OnItemClickListeners.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            playAudio(position);
            Toast.makeText(getApplicationContext(), "You Clicked position: " + position + Main.musicList.get(position).getData(), Toast.LENGTH_SHORT).show();
        }
    }));
}

private void playAudio(int songIndex) {
    //Check if service is active
    if (!MediaPlayerService.musicBound) {
        StorageUtil storageUtil = new StorageUtil(this);
        storageUtil.storeSong(Main.musicList);
        storageUtil.storeSongIndex(songIndex);

        Intent playerIntent = new Intent(this, MediaPlayerService.class);
        startService(playerIntent);
        bindService(playerIntent, Main.musicConnection, Context.BIND_AUTO_CREATE);
    } else {
        //Store new songIndex in mSharedPreferences
        StorageUtil storageUtil = new StorageUtil(this);
        storageUtil.storeSong(Main.musicList);
        storageUtil.storeSongIndex(songIndex);

        //MediaService is active
        //Send media with BroadcastReceiver
        Intent broadCastReceiverIntent = new Intent(broadCast_PlAY_NEW_SONG);
        sendBroadcast(broadCastReceiverIntent);
    }
}

在这个类中,我存储songList和songIndex,其中songlist=保存歌曲信息的数组列表,songindex=单击位置

public class StorageUtil {
private final String STORAGE = "com.vince_mp3player.STORAGE";
private SharedPreferences mSharedPreferences;
private Context context;
private SharedPreferences.Editor mEditor;



public StorageUtil(Context context){
    this.context = context;
}

public void storeSong(List<Song> list){
    mSharedPreferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    mEditor = mSharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    mEditor.putString("songList", json);
    mEditor.apply();
}

public ArrayList<Song> getSongs(){
    mSharedPreferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = mSharedPreferences.getString("songList", null);
    Type type = new TypeToken<List<Song>>(){
    }.getType();
    return gson.fromJson(json, type);
}

public void storeSongIndex(int index) {
    mSharedPreferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    mEditor = mSharedPreferences.edit();
    mEditor.putInt("songIndex", index);
    mEditor.apply();
}

public int loadSongIndex() {
    mSharedPreferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    return mSharedPreferences.getInt("songIndex", -1);//return -1 if no data found
}

public void clearCachedAudioPlaylist() {
    mSharedPreferences = context.getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    mEditor = mSharedPreferences.edit();
    mEditor.clear();
    mEditor.apply();
}
 }

我的问题开始了,假设我们从名单中选择艺术家甲-

然后当我按后退按钮返回,选择艺术家B并点击其中一首歌曲时,它仍然播放艺术家A的歌曲。

即使在我第一个显示所有歌曲的片段中,当我点击一首歌曲时,它也只播放我在“艺术家”选项卡中选择的艺术家的歌曲,当我在3点结束时选择另一首歌曲时,它会崩溃。

当我点击后退按钮时,如何更新我的recyclerviews?

如果你不明白我的帖子,我会给dropbox,github添加代码,这样你就可以自己测试了。

提前谢谢,

文斯

共有1个答案

江佐
2023-03-14

看起来,当您将广播发送到MediaPlayerService时,songList变量仍然设置为创建服务时的初始歌曲。我首先在MediaPlayerService的NewSongBroadcastReceiver中更新了songList,使它能够工作。java

private BroadcastReceiver NewSongBroadCastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        songList = new StorageUtil(getApplicationContext()).getSongs();
        songIndex = new StorageUtil(getApplicationContext()).loadSongIndex();
        if (songIndex != -1 && songIndex < songList.size()){
            activeSong = songList.get(songIndex);
        }else{
            stopSelf();
        }
        stopSong();
        mediaPlayer.reset();
        initMediaPlayer();
        updateMetaData();
        NotificationBuilder(PlaybackStatus.PLAYING);
    }
};
 类似资料:
  • 问题内容: 我要刷新温斯顿记录仪 前 。 有没有类似的东西?除了人们抱怨温斯顿没有得到非常积极的维护之外,我什么也找不到。 作为替代方案,是否有任何流行的(主动维护的)多传输日志记录框架提供冲洗功能? 问题答案: 实际上,Winston允许您传递在记录所有传输后执行的回调: 文件:https://github.com/flatiron/winston#events-and-callbacks-in

  • 问题内容: 我有一个click事件发生在我的自定义指令范围之外,因此,我使用jQuery.click()侦听器并在我的范围内调用一个函数,而不是使用“ ng- click”属性,如下所示: close()是一个简单的函数,如下所示: 在我看来,我有一个绑定到isOpen的“ ng-show”元素,如下所示: 调试时,我发现正在调用close(),isOpen被更新为false,但是AngularJ

  • 如何刷新__consumer_offsets主题? 我刚刚设置了offsets.retention.minutes=1,重新启动了代理,检查了offsets.retention.minutes=1的日志,但是__consumer_offsets主题的50个分区的大小仍然相同。 为什么?

  • 我有一个。当我单击listview行的按钮时,将在,我有定制listView适配器中按钮的。我将该按钮的点击保存在sqlite中,通过该sqlite,我将更新gridview适配器。 因此,我的问题是,当我单击按钮时,GridView本身不会更新,当我关闭应用程序并再次打开时,它会更新。 我尝试使用,但不起作用。 这是自定义列表视图适配器中的代码 和这个在主要活动 ImageAdapter代码。

  • 在MainActivity中,我有一个CardView项目的RecyclerView列表。 单击任何CardView都会启动DetailsActivity CardView,它显示数据库中该特定CardView的更多数据。 单击DetailsActivity CardView会启动EditActivity来编辑该CardView的数据。单击“保存”按钮将用户返回到DetailsActivity,这

  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上