編輯:關於Android編程
實現效果如圖:



FooterView:

package com.iwanghang.drmplayer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.iwanghang.drmplayer.adapter.MyMusicListAdapter;
import com.iwanghang.drmplayer.adapter.NetMusicListAdapter;
import com.iwanghang.drmplayer.utils.AppUtils;
import com.iwanghang.drmplayer.utils.Constant;
import com.iwanghang.drmplayer.utils.SearchMusicUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;
import com.iwanghang.drmplayer.vo.SearchResult;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
public class NetMusicListFragment extends Fragment implements OnItemClickListener,OnClickListener {
private ListView listView_net_music;
//private ArrayList mp3Infos;
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 NetMusicListAdapter netMusicListAdapter;
//存放 網絡音樂 的集合
private ArrayList searchResults = new ArrayList();
private int page = 1;//搜索音樂的頁碼
private MainActivity mainActivity;
//private boolean isPause = false;//歌曲播放中的暫停狀態
private int position = 0;//當前播放的位置,提供給PlayActivity
//onAttach(),當fragment被綁定到activity時被調用(Activity會被傳入.).
@Override
public void onAttach(Context context) {
super.onAttach(context);
//mainActivity = (MainActivity) context;
mainActivity = (MainActivity) getActivity();
}
public static NetMusicListFragment newInstance() {
NetMusicListFragment net = new NetMusicListFragment();
return net;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//UI組件初始化
View view = inflater.inflate(R.layout.net_music_list_layout,null);
//item
listView_net_music = (ListView) view.findViewById(R.id.listView_net_music);
//findViewById
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);
//Item點擊事件監聽
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.BAIDU_URL + Constant.BAIDU_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提示
Toast.makeText(mainActivity,"請輸入歌手或歌詞",Toast.LENGTH_SHORT).show();
return;
}
load_layout.setVisibility(View.VISIBLE);//加載layout效果.顯示
//填充item 使用SearchMusicUtils搜索音樂工具類,並,使用觀察者設計模式,自己回調,自己監聽
//SearchMusicUtils.
}
//加載網絡音樂的異步任務
//Android1.5提供了 工具類 android.os.AsyncTask,它使創建異步任務變得更加簡單,不再需要編寫任務線程和Handler實例即可完成相同的任務。
class LoadNetDataTask extends AsyncTask{
//onPreExecute方法用於在執行後台任務前做一些UI操作
@Override
protected void onPreExecute() {
super.onPreExecute();
load_layout.setVisibility(View.VISIBLE);//加載layout.顯示
listView_net_music.setVisibility(View.GONE);//item.隱藏
searchResults.clear();//搜索結果.清理
}
//doInBackground方法內部執行後台任務,不可在此方法內修改UI
@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();
//半壺紗
//劉珂矣
//千年一般若影視原聲
//韓磊
//從doc分析以上html代碼;把所有span標簽下song-title查找出來,存在songTitles集合中;即,歌名集合;
//從doc分析以上html代碼;把所有span標簽下author_list查找出來,存在artists集合中;即,歌手集合;
Elements songTitles = doc.select("span.song-title");
Elements artists = doc.select("span.author_list");
//System.out.println(artists);
for (int i=0;i半壺紗<,半壺紗就是a鏈接的內容);即,最終的歌名;
Elements urls = songTitles.get(i).getElementsByTag("a");
//System.out.println("@urls : " + urls);
searchResult.setUrl(urls.get(0).attr("href"));//設置最終的url
searchResult.setMusicName(urls.get(0).text());//設置最終的歌名
//a鏈接,存在urls集合中;即,歌曲url集合;
Elements artistElements = artists.get(i).getElementsByTag("a");
//System.out.println("@artistElements : " + artistElements);
searchResult.setArtist(artistElements.get(0).text());//設置最終的歌手
searchResult.setAlbum("熱歌榜");//設置最終的專輯
System.out.println("@searchResult : " + searchResult);
searchResults.add(searchResult);//把最終的所有信息,添加到集合
}
System.out.println("@searchResults : " + searchResults);
//System.out.println("@songTitles.size() : " + searchResults.size());
} catch (IOException e) {
e.printStackTrace();
return -1;
}
return 1;
}
//onPostExecute方法用於在執行完後台任務後更新UI,顯示結果
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if (result==1){
netMusicListAdapter = new NetMusicListAdapter(mainActivity,searchResults);
//System.out.println(searchResults);
listView_net_music.setAdapter(netMusicListAdapter);
listView_net_music.addFooterView(LayoutInflater.from(mainActivity).inflate(R.layout.footviwe_layout,null));
}
load_layout.setVisibility(View.GONE);
listView_net_music.setVisibility(View.VISIBLE);
}
}
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
}
}
package com.iwanghang.drmplayer.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.iwanghang.drmplayer.R;
import com.iwanghang.drmplayer.utils.MediaUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;
import com.iwanghang.drmplayer.vo.SearchResult;
import java.util.ArrayList;
/**
* 自定義的音樂列表適配器(網絡)
* 為了方便擴展,因為之前沒有考慮到顯示專輯封面
* Created by iwanghang on 30/4/16.
*/
public class NetMusicListAdapter extends BaseAdapter{
private Context ctx; //上下文對象引用
private ArrayList searchResults;//存放SearchResult引用的集合
private SearchResult searchResult;//SearchResult對象引用
//private int pos = -1; //列表位置
/**
* 構造函數
* @param ctx 上下文
* @param searchResults 集合對象
*/
public NetMusicListAdapter(Context ctx, ArrayList searchResults){
this.ctx = ctx;
this.searchResults = searchResults;
//System.out.println("MyMusicListAdapter.java #0 : ctx = " + ctx + ",mp3Infos = " + mp3Infos.size());
}
public ArrayList searchResults() {
System.out.println("NetMusicListAdapter.java #1 : public ArrayList searchResults() {");
return searchResults;
}
public void setSearchResults(ArrayList searchResults) {
System.out.println("NetMusicListAdapter.java #2 : public void setMp3Infos(ArrayList searchResults) {");
this.searchResults = searchResults;
}
@Override
public int getCount() {
//System.out.println("NetMusicListAdapter.java #3 : public int getCount() {" + mp3Infos.size());
//return mp3Infos.size();
return searchResults.size();
}
@Override
public Object getItem(int position) {
System.out.println("NetMusicListAdapter.java #4 : public Object getItem(int position) {");
return searchResults.get(position);
}
@Override
public long getItemId(int position) {
//System.out.println("NetMusicListAdapter.java #5 : public long getItemId(int position) {");
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//System.out.println("NetMusicListAdapter.java #6 : public View getView ");
ViewHolder vh;
if(convertView==null){
//vh = new ViewHolder();
convertView = LayoutInflater.from(ctx).inflate(R.layout.item_net_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);
//vh.textView3_time = (TextView) convertView.findViewById(R.id.textView3_time);
//vh.imageView1_ablum = (ImageView) convertView.findViewById(R.id.imageView1_ablum);
//System.out.println("NetMusicListAdapter.java #7 : textView1_title = " + vh.textView1_title);
convertView.setTag(vh);//表示給View添加一個格外的數據,
}else {
vh = (ViewHolder)convertView.getTag();//通過getTag的方法將數據取出來
}
SearchResult searchResult = searchResults.get(position);
vh.textView1_title.setText(searchResult.getMusicName());//顯示標題
vh.textView2_singer.setText(searchResult.getArtist());//顯示歌手
//vh.textView3_time.setText(MediaUtils.formatTime(mp3Info.getDuration()));//顯示時長
//獲取專輯封面圖片
//Bitmap albumBitmapItem = MediaUtils.getArtwork(ctx,mp3Info.getId(),mp3Info.getAlbumId(),true,true);
//System.out.println("NetMusicListAdapter.java #8 : albumBitmapItem = " + albumBitmapItem.getConfig());
//改變播放界面專輯封面圖片
//vh.imageView1_ablum.setImageBitmap(albumBitmapItem);
//vh.imageView1_ablum.setImageResource(R.mipmap.music);
return convertView;
}
/**
* 定義一個內部類
* 聲明相應的控件引用
*/
static class ViewHolder{
//所有控件對象引用
TextView textView1_title;//標題
TextView textView2_singer;//歌手
//TextView textView3_time;//時長
//ImageView imageView1_ablum;//專輯封面圖片
}
}
package com.iwanghang.drmplayer.vo;
/**
* Created by iwanghang on 16/4/29.
* 搜索音樂的對象
*/
public class SearchResult {
private String musicName;
private String url;
private String artist;
private String album;
private long size;//大小
//set方法,get方法
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;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
@Override
public String toString() {
return "SearchResult{" +
"musicName='" + musicName + '\'' +
", url='" + url + '\'' +
", artist='" + artist + '\'' +
", album='" + album + '\'' +
", size=" + size +
'}';
}
}
Android實現通過浏覽器點擊鏈接打開本地應用(APP)並拿到浏覽器傳遞的數據
點擊浏覽器中的URL鏈接,啟動特定的App。 首先做成HTML的頁面,頁面內容格式如下: 啟動應用程序 這一句就可以了。 各個項目含義如下
android四大組件之Service和子類IntentService
四大組件中, Service跟Activity的生命周期非常類似,它也是可執行的.甚至可看做是沒有界面的Activity, 因為它的運行,用戶並不會像Act
Android系統應用信息中存儲和緩存的計算方法
進行如下操作: 應用信息 會到達如下界面: 可以看到這個應用占用的磁盤空間。vcD4KPHA+z8jLtb3hufujrNXivLjP7rvhvMbL48TE0KnOx
android開源系列:CircleImageView自定義圓形控件的使用
主要的類: package de.hdodenhof.circleimageview; import edu.njupt.zhb.main.