Android实战 – 音心播放器 (MusicListActivity – 音乐播放和MainActivity的一个问题)
最后更新于:2022-04-01 10:53:03
# 1.背景
在上篇中实现了分类信息音乐列表的实现,包括页面和设计与实现,在此实现数据的请求和解决一个问题!
1)网络数据请求
2)优化点击事件
3)一个bug修复
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715764f212c4.jpg)
# 2.网络数据请求
里面的数据还是接口上提供的数据,所以在之前我们已经使用过SDK的网络请求做了一些优化和总结,在此进行在此回顾下 :
# (1)图解
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715764d83595.jpg)
# (2)说明
官方的SDK提供了Request方法,所以我们需要AsyncHandler 回调函数,我在这里进行了在此的封装,使得AsyncHandler函数可以进行JSON数据解析操作,返回我们想要的数据。在这里只需要写一个自定义的回调函数实现就可以了。
# 3.优化点击事件
在此之间ListView,GridView , RecyclerView没有点击效果,我怎么感觉怎么别扭,后就统一的用了一个点击效。
本身是半透明的效果,点击后透明度为0.8 ,这个还不错。
* selector.xml *
~~~
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/app_color_zhu" android:state_pressed="true"></item>
<item android:drawable="@color/app_color_whrit"></item>
</selector>
~~~
*两个颜色值 :*
~~~
<color name="app_color_whrit">#55FCFCFC</color>
<color name="app_color_zhu">#88FCFCFC</color>
~~~
# 4.一个问题实现
在之前我们实现的时候,在加载MusicListActivity ,重新加载了数据,后重新启动了MusicService ,变重新赋值了List集合,然后退出点击下面热门榜单的音乐,播放的不是点击的音乐,而是刚刚打开MusicListActivity 的音乐。这是很简单的道理,因为在返回MainActivity 的时候,并没有重新给MusicService 赋值,所以问题来了?
解决:
* 一张图看清楚过程 :*
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715764f7797f.jpg)
也就是说 在MusicListActivity 返回 MainActivity 的时候,我们需要重新的启动MusicService ,赋值给List ;
# 5.MusicListActivity 源码
~~~
package cn.labelnet.maskmusic;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import cn.labelnet.adapter.MusicTypeListAdapter;
import cn.labelnet.event.MusicListRecyclerOnItemClick;
import cn.labelnet.framework.MusicService;
import cn.labelnet.maskmusic.MainActivity.SwifRefushListener;
import cn.labelnet.model.MusicModel;
import cn.labelnet.net.MusicAsync;
import cn.labelnet.net.MusicAsyncHandler;
import cn.labelnet.net.MusicRequest;
import cn.labelnet.ui.SpacesItemDecoration;
public class MusicListActivity extends Activity implements MusicAsync,
MusicListRecyclerOnItemClick, OnClickListener {
/**
* 控件
*/
private TextView tv_list_type,tv_list_item_show;
private RecyclerView list_recycler_view;
private MusicTypeListAdapter musicTypeAdapter;
private ImageView tv_list_return;
private SparseArray<String> maps = new SparseArray<String>();
private final int REQUEST_CODE=123;
/**
* 网络数据
*/
private MusicRequest musicRequest = null;
private MusicAsyncHandler musicHandler = null;
/**
* 数据保留
*/
private List<MusicModel> musics = new ArrayList<MusicModel>();
private final String MUSIC_INTENT_KEY = "musics";
private final int MUSIC_INTENT_FLAG = 20001;
/**
* 和MusicService 通信
*/
private Intent musicIntent = null;
private final String MAIN_ACTIVIY_ACTION = "mainActivity.To.MusicService";
private final String MAIN_MUSIC_INTENT_KEY = "mIntent";
// 滚动条
private SwipeRefreshLayout swiperefresh_wei;
private int typeid = 5;
//
private Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music_list);
initView();
initData();
initFrameWork();
initTypes();
initRefresh();
typeid=getIntent().getIntExtra("musictype", 5);
// 进行数据请求
musicRequest.requestStringData(typeid);
tv_list_type.setText(maps.get(typeid));
// Log.d("MaskMusic", typeid + "typeid");
}
/**
* 初始化进度条
*/
private void initRefresh() {
swiperefresh_wei = (SwipeRefreshLayout) findViewById(R.id.swiperefresh_wei);
SwifRefushListener swifRefushListener = new SwifRefushListener();
swiperefresh_wei.setColorSchemeResources(R.color.app_color_zhu,
R.color.app_color_zi, R.color.text_color_black,
R.color.text_color_main);
swiperefresh_wei.setSize(SwipeRefreshLayout.LARGE);
// 设置进度条的位置
swiperefresh_wei.setProgressViewEndTarget(true, 800);
// 设置监听
swiperefresh_wei.setOnRefreshListener(swifRefushListener);
// 首次加载开启刷新
swiperefresh_wei.post(new Runnable() {
@Override
public void run() {
swiperefresh_wei.setRefreshing(true);
}
});
swifRefushListener.onRefresh();
}
/**
* 初始化分类信息
*/
private void initTypes() {
maps.put(18, getString(R.string.music_fenlei_mingyao));
maps.put(23, getString(R.string.msuic_fenlei_xiaoliang));
maps.put(5,getString(R.string.music_fenlei_china));
maps.put(3,getString(R.string.music_fenlei_oumei));
maps.put(6,getString(R.string.music_fenlei_hangkang));
maps.put(16,getString(R.string.music_fenlei_hanguo));
maps.put(17,getString(R.string.music_fenlei_riben));
maps.put(19,getString(R.string.music_fenlei_yaogun));
maps.put(26,getString(R.string.music_list_resou));
}
/**
* 初始化组件
*/
private void initFrameWork() {
// 初始化MusicService 广播组件Intent
musicIntent = new Intent();
// 设置识别Action
musicIntent.setAction(MAIN_ACTIVIY_ACTION);
// 设置来源
musicIntent.addFlags(MUSIC_INTENT_FLAG);
}
/**
* 初始化网络请求数据
*/
private void initData() {
// 请求基本数据
musicHandler = new MusicAsyncHandler();
musicHandler.setMAsync(this);
musicRequest = new MusicRequest();
musicRequest.setMusicAsyncHandler(musicHandler);
}
/**
* 初始化界面
*/
private void initView() {
tv_list_item_show=(TextView) findViewById(R.id.tv_list_item_show);
tv_list_return = (ImageView) findViewById(R.id.tv_list_return);
tv_list_return.setOnClickListener(this);
tv_list_type = (TextView) findViewById(R.id.tv_list_type);
list_recycler_view = (RecyclerView) findViewById(R.id.list_recycler_view);
// 设置是否固定长度
list_recycler_view.setHasFixedSize(true);
// 添加样式
list_recycler_view.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL, false));
// 添加item动画
list_recycler_view.setItemAnimator(new DefaultItemAnimator());
// 添加item分割线
list_recycler_view.addItemDecoration(new SpacesItemDecoration(2));
// 添加适配器
musicTypeAdapter = new MusicTypeListAdapter(musics, this, this);
list_recycler_view.setAdapter(musicTypeAdapter);
}
@Override
public void onSuccess(List<MusicModel> mms) {
// Log.d("MaskMusic", "MMS : " + mms);
// 请求成功
synchronized (musics) {
musics.clear();
musics.addAll(mms);
musicTypeAdapter.notifyDataSetChanged();
}
Intent intent = new Intent(MusicListActivity.this, MusicService.class);
intent.putExtra(MUSIC_INTENT_KEY, (Serializable) musics);
intent.addFlags(MUSIC_INTENT_FLAG);
startService(intent);
hideProgress();
}
/**
* 隐藏进度条
* 隐藏提示
*/
private void hideProgress() {
swiperefresh_wei.setRefreshing(false);
tv_list_item_show.setVisibility(View.GONE);
}
@Override
public void onFail(String msg) {
// 请求失败
showToast(msg);
hideProgress();
}
/**
* Toast
*
* @param msg
*/
private void showToast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
/**
* 点击事件
*/
@Override
public void onRecyclerItemClick(int position) {
// Log.d("MaskMusic", "Position :"+position);
musicIntent.putExtra(MAIN_MUSIC_INTENT_KEY, position);
sendBroadcast(musicIntent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_list_return:
startActivityForResult(new Intent(MusicListActivity.this,MainActivity.class),REQUEST_CODE);
finish();
break;
}
}
@Override
public void onBackPressed() {
startActivityForResult(new Intent(MusicListActivity.this,MainActivity.class),REQUEST_CODE);
finish();
}
/**
* 1.下拉刷新监听 下拉刷新
*/
class SwifRefushListener implements SwipeRefreshLayout.OnRefreshListener {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//隐藏进度条
hideProgress();
}
}, 3000);
}
}
}
~~~
# 6.总结
在这里使用了v4兼容包下的SwipeRefreshLayout 进度条,在这里就不说明了,即方便又简单的可以实现进度条功能;