Mp3Player(7) Mp3ListActivity、onListItemClick
-
//Mp3ListActivity.java
-
package com.lwb.mp3player;
-
-
import java.io.StringReader;
-
import java.util.ArrayList;
-
import java.util.HashMap;
-
import java.util.Iterator;
-
import java.util.List;
-
-
import javax.xml.parsers.SAXParserFactory;
-
-
import org.xml.sax.InputSource;
-
import org.xml.sax.XMLReader;
-
-
import com.lwb.download.HttpDownloader;
-
import com.lwb.model.Mp3Info;
-
import com.lwb.mp3player.service.DownloadService;
-
import com.lwb.xml.Mp3ListContentHandler;
-
-
import android.os.Bundle;
-
import android.app.Activity;
-
import android.app.ListActivity;
-
import android.content.Intent;
-
import android.view.Menu;
-
import android.view.MenuItem;
-
import android.view.View;
-
import android.widget.ListView;
-
import android.widget.SimpleAdapter;
-
-
/*本Activity的作用:从网络上下载歌曲描述文件 显示在 列表Activity上,
-
* 可通过点击某歌曲进行下载()
-
* 新知识点:
-
* 1、从网络上下载歌曲描述文件
-
* 下载:xml = downloadXML()
-
* 解析文件描述:mp3Infos = parse(xml)
-
* 2、更新列表:buildSimpleAdater(mp3Infos);
-
* */
-
//Mp3ListActivity继承了列表型的Activity。ListActivity
-
public class Mp3ListActivity extends ListActivity {
-
-
private static final int UPDATE = 1;
-
private static final int ABOUT = 2;
-
-
private List<Mp3Info> mp3Infos = null;
-
-
// Mp3Info类型是自定义的,用来描述MP3Info的属性
-
// 用链表List来装歌曲的信息Mp3Info
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.remote_mp3_list);// 这里设置的布局
-
updateListView();// 并从网络获取资源并更新列表
-
}
-
-
// 并从网络获取资源并更新列表
-
private void updateListView() {
-
try{
-
String xml = downloadXML("");//下载文件
-
// 对xml文件进行解析,并将解析的结果放置在Mp3Info对象当中,最后将这些Mp3对象放置在List中
-
mp3Infos = parse(xml);// 解析 得到mp3infos
-
buildSimpleAdater(mp3Infos);//更新列表歌曲条目
-
}
-
catch (Exception e) {
-
System.out.println("*******updateListView()22222222222");
-
e.printStackTrace();
-
}
-
}
-
-
/* 下载文件xml文件 downloadXML(String urlStr)
-
* 其中urlStr是网址
-
* 创建一个HttpDownloader
-
* 调用HttpDownloader中的download方法
-
* */
-
private String downloadXML(String urlStr) {
-
HttpDownloader httpDownloader = new HttpDownloader();
-
String result = httpDownloader.download(urlStr);
-
return result;
-
}
-
-
/*List parse(String xmlStr)解析字符串xmlStr所代表的xml文本
-
* 1、生成一个SAXParserFactory解析器 :saxParserFactory = SAXParserFactory.newInstance()
-
* 2、生成一个XMLReader xml读取对象xmlReader = saxParserFactory.newSAXParser().getXMLReader()
-
* 3、创建一个解析规则对象:Mp3ListContentHandler,这个类型是有自己定义的
-
* new Mp3ListContentHandler(infos); //注意这里传入了一个infos
-
* 4、为xmlReader设置文本内容解析规则xmlReader.setContentHandler(mp3ListContenthandler);
-
* 5、进行xmlStr字符串进行解析xmlReader.parse(new InputSorce(new StringReader(xmlStr)))
-
*
-
* */
-
private List<Mp3Info> parse(String xmlStr) {
-
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();// 生成一个解析器
-
try {
-
XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();// 生一个XMLReader对象
-
List<Mp3Info> infos = new ArrayList<Mp3Info>();//该List表用于存放在线歌曲信息
-
-
// 下面是生成一个Mp3ListContentHandler //定义一个mp3内容处理器 使用Adater处理器实现的
-
// 结果是可以得到一个resource.xml 进行解析 得到一首首个的列表
-
Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(infos); //注意这里传入了一个infos
-
xmlReader.setContentHandler(mp3ListContentHandler);// 这个相当于为xmlReader设置解析函数,哈哈
-
xmlReader.parse(new InputSource(new StringReader(xmlStr)));// 对xmlStr字符串进行解析
-
for (Iterator iterator = infos.iterator(); iterator.hasNext();) {
-
Mp3Info mp3Info = (Mp3Info) iterator.next();
-
}
-
return infos;
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return null;
-
}
-
-
/*buildSimpleAdater()作用是获取 传入参数List中的歌曲的信息生成列表
-
* 步骤:
-
* 1、创建一个List>
-
* 把类型HashMap的 map,添加到表中list.add(map);
-
* 注:map是一种键值对
-
* map.put("mp3_name", mp3Info.getMp3Name());
-
map.put("mp3_size", mp3Info.getMp3Size());
-
2、创建一个SimpleAdapter,并传入各种参数
-
new SimpleAdapter(this, list,
-
R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size" },
-
new int[] { R.id.mp3_name, R.id.mp3_size });
-
this:表这个当前的Mp3ListActivity。
-
list:表要显示的内容所在暂存的List表
-
R.layout.mp3info_item:表列表的布局
-
new String[] { "mp3_name", "mp3_size"},表两列中的关键Key
-
new int[] { R.id.mp3_name, R.id.mp3_size }表布局中的两列
-
3、设置Adater:setListAdapter(simpleAdapter);
-
* */
-
private SimpleAdapter buildSimpleAdater(List<Mp3Info> mp3Infos) {
-
// 生成一个List对象,并按照SimpleAdapter的标准,将mp3Infos当中的数据添加到List当中去
-
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
-
for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
-
Mp3Info mp3Info = (Mp3Info) iterator.next();
-
HashMap<String, String> map = new HashMap<String, String>();
-
map.put("mp3_name", mp3Info.getMp3Name());
-
map.put("mp3_size", mp3Info.getMp3Size());
-
list.add(map);
-
}
-
SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,
-
R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size" },
-
new int[] { R.id.mp3_name, R.id.mp3_size });
-
setListAdapter(simpleAdapter);
-
return simpleAdapter;
-
}
-
-
/*OnListItemClick(ListView l,View v,int position,long id)
-
*当点击列表中的某一歌曲时进行下载歌曲,下载歌曲是在另一Service中进行的
-
* 其中的position就是被点击歌曲在ListActivity中的序号
-
* 重点是 由Activity启动Severce的方法是:
-
* 1、生成一个Intent Intent Intent = new Intent()
-
* 2、把要传递给Service的信息通过 Intent.putExtra("mp3Info",mp3Info)进行传递
-
* 3、设置要启动的Service intent.setClass(this,DownloadService.class);
-
* 4、启动Service:startService(intent)
-
* */
-
@Override
-
protected void onListItemClick(ListView l, View v, int position, long id) {
-
// 根据用户点击列表当中的位置来得到相应的mp3Info对象
-
Mp3Info mp3Info = mp3Infos.get(position);
-
// 生成Intent对象
-
Intent intent = new Intent();
-
// 把Mp3Info对象存入到Intent对象当中
-
intent.putExtra("mp3Info", mp3Info);
-
intent.setClass(this, DownloadService.class);
-
// 启动Service
-
startService(intent);
-
super.onListItemClick(l, v, position, id);
-
}
-
-
/*onCreateOptionMenu(Menu menu)创建菜单
-
* 通过 menu.add(0,UPDATE,1,R.string.mp3list_update);
-
* 0:不知道是什么
-
* UPDATE:表在菜单中出现的次序
-
* 1:不知道是什么
-
* R.string.mp3list_update:表菜单显示字符串
-
* */
-
/* 在用户点击MENU按钮之后,会调用该方法,我可以在这里添加我们的控件 */
-
@Override
-
public boolean onCreateOptionsMenu(Menu menu) {
-
menu.add(0, UPDATE, 1, R.string.mp3list_update);
-
menu.add(0, ABOUT, 2, R.string.mp3list_about);
-
// getMenuInflater().inflate(R.menu.mp3_list, menu); ?????????
-
return super.onCreateOptionsMenu(menu);
-
// return true;
-
}
-
-
// 用户点击菜单按钮回调函数 onOptionsItemSelected(MenuItem item) item就是被点击的项
-
@Override
-
public boolean onOptionsItemSelected(MenuItem item) {
-
if (item.getItemId() == UPDATE) {
-
// 用户点击更新按钮
-
updateListView();
-
} else if (item.getItemId() == ABOUT) {
-
// 用户点击了关于按钮
-
}
-
return super.onOptionsItemSelected(item);
-
}
-
}
阅读(392) | 评论(0) | 转发(0) |