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

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

木雨音乐 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.ib_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);
        }
    }
}


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

布局控件可自行设计,代码不再上传


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值