木雨音乐 项目开发(十)网络推荐——加载各大榜单网络音乐列表
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); } } }
上述代码某些方法实现见下节
布局控件可自行设计,代码不再上传
相关文章推荐
- 木雨音乐 项目开发(九)网络推荐——设置九大榜单
- 木雨音乐 项目开发(十一)网络推荐——搜索歌曲
- Android开发本地及网络Mp3音乐播放器(九)音乐收藏与列表切换
- 木雨音乐 项目开发(四)本地音乐MyMusicListFragment
- Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
- 木雨音乐 项目开发(一)
- Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)
- 木雨音乐 项目开发(二)(闪屏页)
- 团队项目推荐:基于社交网络的自动音乐推荐系统——by ZhongXia
- 封装项目整体架构,访问网络数据,展示列表数据,根据图片数量的不同来多条目加载,使用Universal-Image-Loader进行图片加载
- 木雨音乐 项目开发(六)音乐播放界面PlayActivity实现
- Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
- Android开发本地及网络Mp3音乐播放器(九)音乐收藏与列表切换
- 团队项目推荐:基于社交网络的自动音乐推荐系统——by ZhongXia
- jsp开发教程之 仿MOP论坛 三(帖子列表-下) 推荐
- 完美解决“换另一台电脑上用VS2008继续开发web项目时出现“System.Runtime.InteropServices.COMException”,然后是加载不了项目。”
- 推荐下一代网络开发框架Stripes
- 如何获取独立项目开发经验 推荐
- 项目经理,WEB开发,BI开发,微软职位,多多推荐!
- 项目经理的工具箱---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三) 推荐