我用碎片制作了一个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添加代码,这样你就可以自己测试了。
提前谢谢,
文斯
看起来,当您将广播发送到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索引读取器上