您的位置:首页 > 理论基础 > 计算机网络

木雨音乐 项目开发(十)网络推荐——加载各大榜单网络音乐列表

2016-08-24 17:32 676 查看

加载各大榜单网络音乐列表

木雨音乐 APP已在百度手机助手上架,有兴趣的朋友可以下载测试,下载地址:http://shouji.baidu.com/software/9785031.htm
木雨音乐源码下载地址:http://download.csdn.net/detail/haoxue641/9610782
希望大家多提宝贵意见

建立网络音乐列表适配器NetMusicAdapt.java

package com.haoxue.zixueplayer.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.haoxue.zixueplayer.R;
import com.haoxue.zixueplayer.vo.SearchResult;

import java.util.ArrayList;

/**
* 网络音乐列表适配器
* Created by Administrator on 2016/7/31.
*/
public class NetMusicAdapter extends BaseAdapter{

private Context ctx;
private ArrayList<SearchResult> searchResults;

public NetMusicAdapter(Context ctx, ArrayList<SearchResult> searchResults) {
this.ctx = ctx;
this.searchResults = searchResults;
}

public ArrayList<SearchResult> getSearchResults() {
return searchResults;
}

public void setSearchResults(ArrayList<SearchResult> searchResults) {
this.searchResults = searchResults;
}

@Override
public int getCount() {
return searchResults.size();
}

@Override
public Object getItem(int position) {
return searchResults.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh;
if (convertView == null) {
convertView= LayoutInflater.from(ctx).inflate(R.layout.net_item_music_list,null);
vh=new ViewHolder();
vh.textView1_title= (TextView) convertView.findViewById(R.id.textView1_title);
vh.textView2_singer= (TextView) convertView.findViewById(R.id.textView2_singer);
convertView.setTag(vh);
}
vh= (ViewHolder) convertView.getTag();
SearchResult result=searchResults.get(position);
vh.textView1_title.setText(result.getMusicName());
vh.textView2_singer.setText(result.getArtist());
return convertView;
}

static class ViewHolder{
TextView textView1_title;
TextView textView2_singer;
}
}

net_item_music_list.xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#24000000">

<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:id="@+id/imageView1_icon"
android:src="@mipmap/music"
android:layout_marginRight="10dp"/>

<LinearLayout

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView1_title"
android:textColor="@android:color/white"
android:text="TextView"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView2_singer"
android:textColor="@android:color/darker_gray"
android:text="TextView"/>
</LinearLayout>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView_xia"
android:src="@mipmap/local_music_more"/>

</LinearLayout>

建立搜索音乐对象实体类SearchResult.java

package com.haoxue.zixueplayer.vo;

/**
* 搜索音乐的对象
* Created by Administrator on 2016/7/31.
*/
public class SearchResult {
private String musicName;
private String url;
private String artist;
private String album;

public String getMusicName() {
return musicName;
}

public void setMusicName(String musicName) {
this.musicName = musicName;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getArtist() {
return artist;
}

public void setArtist(String artist) {
this.artist = artist;
}

public String getAlbum() {
return album;
}

public void setAlbum(String album) {
this.album = album;
}

@Override
public String toString() {
return "SearchResult{" +
"musicName='" + musicName + '\'' +
", url='" + url + '\'' +
", artist='" + artist + '\'' +
", album='" + album + '\'' +
'}';
}
}

以华语榜为例加载华语榜,其他榜单类似,NetHotMusicListFragment.java代码如下

package com.haoxue.zixueplayer.musicfragment;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.haoxue.zixueplayer.DownloadDialogFragment;
import com.haoxue.zixueplayer.MainActivity;
import com.haoxue.zixueplayer.R;
import com.haoxue.zixueplayer.adapter.NetMusicAdapter;
import com.haoxue.zixueplayer.utils.AppUtils;
import com.haoxue.zixueplayer.utils.Constant;
import com.haoxue.zixueplayer.utils.SearchMusicUtils;
import com.haoxue.zixueplayer.vo.SearchResult;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;

/**
* Created by Administrator on 2016/7/27.
*/
public class NetHotMusicListFragment extends Fragment implements View.OnClickListener,AdapterView.OnItemClickListener{

private MainActivity mainActivity;
private ListView listView_net_music;
private LinearLayout load_layout;
private LinearLayout ll_search_btn_container;
private LinearLayout ll_search_container;
private ImageButton ib_search_btn;
private EditText et_search_content;
private ArrayList<SearchResult> searchResults=new ArrayList<>();
private NetMusicAdapter netMusicAdapter;

private TextView title_title;

//    private int page=1;//搜索音乐的页码

public static NetHotMusicListFragment newInstance() {
NetHotMusicListFragment net = new NetHotMusicListFragment();
return net;
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mainActivity = (MainActivity) getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
//UI组件的初始化
View view=inflater.inflate(R.layout.net_music_list,null);
listView_net_music= (ListView) view.findViewById(R.id.listView_net_music);
load_layout= (LinearLayout) view.findViewById(R.id.load_layout);
ll_search_btn_container= (LinearLayout) view.findViewById(R.id.ll_search_btn_container);
ll_search_container= (LinearLayout) view.findViewById(R.id.ll_search_container);
ib_search_btn= (ImageButton) view .findViewById(R.id.ib_search_btn);
et_search_content= (EditText) view .findViewById(R.id.et_search_content);
title_title= (TextView) view.findViewById(R.id.title_title);

title_title.setText("华语榜");
listView_net_music.setOnItemClickListener(this);
ll_search_btn_container.setOnClickListener(this);
ib_search_btn.setOnClickListener(this);
loadNetData();//加载网络音乐

return view;
}

private void loadNetData() {
load_layout.setVisibility(View.VISIBLE);//显示
//执行异步加载网络音乐的任务
new LoadNetDataTask().execute(Constant.MIGU_URL+Constant.MIGU_DAYHOT);
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.ll_search_btn_container:
ll_search_btn_container.setVisibility(View.GONE);
ll_search_container.setVisibility(View.VISIBLE);
break;
case R.id.i
cd48
b_search_btn:
//搜索事件处理
searchMusic();
break;
}
}

//搜索音乐
private void searchMusic() {
//隐藏输入法
AppUtils.hideInputMethod(et_search_content);
ll_search_btn_container.setVisibility(View.VISIBLE);
ll_search_container.setVisibility(View.GONE);
String key=et_search_content.getText().toString();
if (TextUtils.isEmpty(key)){
Toast.makeText(mainActivity, "请输入歌名或歌手", Toast.LENGTH_SHORT).show();
return;
}
load_layout.setVisibility(View.VISIBLE);

SearchMusicUtils.getsInstance().setListener(new SearchMusicUtils.OnSearchResultListener(){
@Override
public void onSearchResult(ArrayList<SearchResult> results){
//                System.out.println(results);
if (results == null) {
load_layout.setVisibility(View.GONE);
Toast.makeText(mainActivity, "没有搜索到相关歌曲", Toast.LENGTH_SHORT).show();
}else {
ArrayList<SearchResult> sr=netMusicAdapter.getSearchResults();
sr.clear();
sr.addAll(results);
netMusicAdapter.notifyDataSetChanged();
load_layout.setVisibility(View.GONE);
}
}
}).search(key);
}

//列表项的单击事件
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= netMusicAdapter.getSearchResults().size()||position<0) return;
showDownloadDialog(position);

}

//下载弹窗
private void showDownloadDialog(final int position) {
DownloadDialogFragment downloadDialogFragment=DownloadDialogFragment.newInstance(searchResults.get(position));
downloadDialogFragment.show(getFragmentManager(),"download");
}

/**
* 加载网络音乐的异步任务
*/
class LoadNetDataTask extends AsyncTask<String,Integer,Integer>{

@Override
protected void onPreExecute() {
super.onPreExecute();
load_layout.setVisibility(View.VISIBLE);
title_title.setVisibility(View.GONE);
listView_net_music.setVisibility(View.GONE);
searchResults.clear();
}

@Override
protected Integer doInBackground(String... params) {
String url=params[0];
try {
//使用Jsoup组件请求网络,并解析音乐数据
Document doc= Jsoup.connect(url).userAgent(Constant.USER_AGENT).timeout(6*1000).get();
//                System.out.println(doc);

Elements songTitles=doc.select("[class=fl song_name text_clip]");
Elements artists=doc.select("[class=fl singer_name mr5 text_clip]");
//                System.out.println("songTitles"+songTitles.toString());
//                System.out.println("artists"+artists.toString());
for (int i = 0; i <songTitles.size() ; i++) {
SearchResult searchResult=new SearchResult();
Elements urls=songTitles.get(i).getElementsByTag("a");
Elements artistElements=artists.get(i).getElementsByTag("a");
String URL=urls.get(0).attr("href");
String MusicName=urls.get(0).text();
String Artist=artistElements.get(0).text();
searchResult.setUrl(URL);
searchResult.setMusicName(MusicName);
searchResult.setArtist(Artist);
searchResult.setAlbum("热歌榜");
searchResults.add(searchResult);
}
//                System.out.println("列表"+searchResults);
} catch (IOException e) {
e.printStackTrace();
return -1;
}
return 1;
}

@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if (result == 1) {
netMusicAdapter=new NetMusicAdapter(mainActivity,searchResults);
//                System.out.println(searchResults);
listView_net_music.setAdapter(netMusicAdapter);
listView_net_music.addFooterView(LayoutInflater.from(mainActivity).inflate(R.layout.footview_layout,null));
}
load_layout.setVisibility(View.GONE);
title_title.setVisibility(View.VISIBLE);
listView_net_music.setVisibility(View.VISIBLE);
}
}
}


常量池Constant.java代码如下

package com.haoxue.zixueplayer.utils;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import android.widget.Toast;

import java.io.File;

/**
* Created by Administrator on 2016/7/29.
* 常量池 用于保存常量
*/
public class Constant {

public static String SP_NAME="MuyuMusic";
public static final String DB_NAME="MuyuPlayer.db";
public static final int PLAY_RECORD_NUM=10;//最劲播放显示的最大条数

//咪咕音乐地址
public static final String MIGU_URL="http://music.migu.cn/";

//华语榜
public static final String MIGU_DAYHOT="rank/184_98.html?loc=P4Z1Y4L1N1&locno=0";
//欧美榜
public static final String MIGU_DAYEUS="rank/184_101.html?loc=P4Z1Y5L1N1&locno=0";
//日韩榜
public static final String MIGU_DAYJSK="rank/184_100.html?loc=P4Z1Y6L1N1&locno=0";
//原创榜
public static final String MIGU_DAYORI="rank/184_104.html?loc=P4Z1Y7L1N1&locno=0";
//影视榜
public static final String MIGU_DAYMTV="rank/184_103.html?loc=P4Z1Y8L1N1&locno=0";
//网络榜
public static final String MIGU_DAYNET="rank/184_106.html?loc=P4Z1Y9L1N1&locno=0";
//民族榜
public static final String MIGU_DAYNAT="rank/184_108.html?loc=P4Z1Y10L1N1&locno=0";
//纯音乐榜
public static final String MIGU_DAYPUR="rank/184_107.html?loc=P4Z1Y11L1N1&locno=0";
//KTV点歌榜
public static final String MIGU_DAYKTV="rank/184_109.html?loc=P4Z1Y12L1N1&locno=0";

//搜索
public static final String MIGU1_SEARCH1="webfront/searchNew/searchAll.do?keyword=";
public static final String MIGU1_SEARCH2="&keytype=all&pagesize=200&pagenum=1";

//下载
public static final String MIGU_DOWN_HEAD = "http://music.migu.cn/order/";
public static final String MIGU_DOWN_FOOT = "/down/self/P2Z3Y12L1N2/3/001002A/1003215279";
//歌词
public static final String BAIDU_LRC_SEARCH_HEAD = "http://music.baidu.com/search/lrc?key=";

public static final String USER_AGENT="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0";

//成功标记
public static final int SUCCESS=1;
//失败标记
public static final int FAILED=2;

public static final String DIR_MUSIC="/Music";
public static final String DIR_LRC="/Music/lrc/";

/***判断网络是否正常**/
public static boolean getNetIsAvailable(Context context){
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=connManager.getActiveNetworkInfo();
if(networkInfo==null){
return false;
}
return networkInfo.isAvailable();
}
/**
* 提示消息
* */
public static Toast showMessage(Toast toastMsg, Context context, String msg) {
if (toastMsg == null) {
toastMsg = Toast.makeText(context, msg, Toast.LENGTH_LONG);
} else {
toastMsg.setText(msg);
}
toastMsg.show();
return toastMsg;
}
/**
* 删除文件并删除媒体库中数据
* */
public static boolean deleteFile(Context context,String filePath){
new File(filePath).delete();
ContentResolver cr=context.getContentResolver();
int id=-1;
Cursor cursor=cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media._ID}
, MediaStore.Audio.Media.DATA+"=?", new String[]{filePath}, null);
if(cursor.moveToNext()){
id=cursor.getInt(0);
}
cursor.close();
if(id!=-1){
return cr.delete(ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id), null, null)>0;
}
return false;
}

/**
* 获取屏幕的大小0:宽度 1:高度
* */
public static int[] getScreen(Context context) {
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
return new int[] { (int) (outMetrics.density * outMetrics.widthPixels),
(int) (outMetrics.density * outMetrics.heightPixels) };
}
/**
* 获取文件的后缀名,返回大写
* */
public static String getSuffix(String str) {
int i = str.lastIndexOf('.');
if (i != -1) {
return str.substring(i + 1).toUpperCase();
}
return str;
}
/**
* 格式化毫秒->00:00
* */
public static String formatSecondTime(int millisecond) {
if (millisecond == 0) {
return "00:00";
}
millisecond = millisecond / 1000;
int m = millisecond / 60 % 60;
int s = millisecond % 60;
return (m > 9 ? m : "0" + m) + ":" + (s > 9 ? s : "0" + s);
}

/**
* 格式化文件大小 Byte->MB
* */
public static String formatByteToMB(long l){
float mb=l/1024f/1024f;
return String.format("%.2f",mb);
}
/**
* 根据文件路径获取文件目录
* */
public static String clearFileName(String str) {
int i = str.lastIndexOf(File.separator);
if (i != -1) {
return str.substring(0, i + 1);
}
return str;
}
/**
* 根据文件名获取不带后缀名的文件名
* */
public static String clearSuffix(String str) {
int i = str.lastIndexOf(".");
if (i != -1) {
return str.substring(0, i);
}
return str;
}
/**
* 根据文件路径获取不带后缀名的文件名
* */
public static String clearDirectory(String str) {
int i = str.lastIndexOf(File.separator);
if (i != -1) {
return clearSuffix(str.substring(i + 1, str.length()));
}
return str;
}
/**
* 检查SD卡是否已装载
* */
public static boolean isExistSdCard(){
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/**
* 获得SD目录路径
* */
public static String getSdCardPath(){
return Environment.getExternalStorageDirectory().getPath();
}

/**
* 判断文件是否存在
* */
public static boolean isExistFile(String file){
return new File(file).exists();
}
/**
* 判断目录是否存在,不在则创建
* */
public static void isExistDirectory(String directoryName) {
File file = new File(directoryName);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 修改文件名
* */
public static String renameFileName(String str){
int i=str.lastIndexOf('.');
if(i!=-1){
File file=new File(str);
file.renameTo(new File(str.substring(0,i)));
return str.substring(0,i);
}
return str;
}
}


隐藏输入法AppUtils.java代码如下
package com.haoxue.zixueplayer.utils;

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

import com.haoxue.zixueplayer.MuyuPlayerApp;

/**
* Created by Administrator on 2016/8/1.
*/
public class AppUtils {
//隐藏输入法
public static void hideInputMethod(View view){
InputMethodManager imm= (InputMethodManager) MuyuPlayerApp.context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()){
imm.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}


上述代码某些方法实现见下节

布局控件可自行设计,代码不再上传
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐