# 1.背景
? ? 在上篇中實現了分類信息音樂列表的實現,包括頁面和設計與實現,在此實現數據的請求和解決一個問題!
? ? 1)網絡數據請求
? ? 2)優化點擊事件
? ? 3)一個bug修復
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
# 2.網絡數據請求
? ? 里面的數據還是接口上提供的數據,所以在之前我們已經使用過SDK的網絡請求做了一些優化和總結,在此進行在此回顧下 :
# ? ? (1)圖解

# ? ?(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 賦值,所以問題來了?
? ? 解決:
*? ? 一張圖看清楚過程 :*
??
? ? ? ? 也就是說 在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 進度條,在這里就不說明了,即方便又簡單的可以實現進度條功能;
- 前言
- Android實戰 - 音心音樂播放器 (開啟篇)
- Android實戰 - 音心音樂播發器 (主界面實現)
- Android實戰 - 音心播放器 (Music Service 實現)
- Android實戰 - 音心播放器 (通知實現音樂的播放/暫停/下一曲控制)
- Android實戰 - 音心播發器 (MusicService ,Notification, MainActivity 總結)
- Android實戰 - 音心播放器 (MusicActivity-音樂播放頁面界面實現)
- Android實戰 - 音心播放器 (MusciActivity-專輯圖片獲得,基本控制實現)
- Android實戰 - 音心播放器(MusicActivity - 歌詞實現)
- Android實戰 - 音心播放器 (MusicActivity - 倒計時 ,進度條實現)
- Android實戰 - 音心播放器 (MusicActivity ,MusicNotification,MusicService總結)
- Android實戰 - 音心播放器 (MusicListActivity - 分類信息界面實現)
- Android實戰 - 音心播放器 (MusicListActivity - 音樂播放和MainActivity的一個問題)
- Android實戰 - 音心播放器 (啟動頁與社交分享(ShareSDK))
- Android實戰 - 音心播放器 (優化Service退出,按兩下退出應用實現)
- Android實戰 - 音心播放器 (項目總結,應用打包發布)