1.在src中新建一个包*.xml,在其中新建一个类Mp3ListContentHandler继承DefaultHandler,以便设置SAX解析的时的Handler,直接附上代码先:
public class Mp3ListContentHandler extends DefaultHandler{ private List<Mp3Info> infos = null; private Mp3Info mp3Info = null; private String tagName = null; public Mp3ListContentHandler(List<Mp3Info> infos) { super(); this.infos = infos; } public List<Mp3Info> getInfos() { return infos; } public void setInfos(List<Mp3Info> infos) { this.infos = infos; } @Override public void characters(char[] ch, int start, int length) throws SAXException { String temp = new String(ch,start,length); if(tagName.equals("id")){ mp3Info.setId(temp); } else if(tagName.equals("mp3.name")){ mp3Info.setMp3Name(temp); } else if(tagName.equals("mp3.size")){ mp3Info.setMp3Size(temp); } else if(tagName.equals("lrc.name")){ mp3Info.setLrcName(temp); } else if(tagName.equals("lrc.size")){ mp3Info.setLrcSize(temp); } } @Override public void endDocument() throws SAXException { } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("resource")){ infos.add(mp3Info); } tagName = ""; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { this.tagName = localName; if(tagName.equals("resource")){ mp3Info = new Mp3Info(); } }
a.每解析到<resource>的startElement时,表示一个新的MP3对象被解析到,创建新的mp3Info对象存储Mp3对象
b.每解析到</resource>的endElement时,表示一个MP3对象的解析完成,将这个mp3Info对象放到infos中
2. c.这里需要用到Mp3Info对象,因此创建一个Mp3Info类,用来实现在XML文件解析过程中对每个MP3的属性进行存储,我们放在/src/*.model/中,代码如下:
public class Mp3Info implements Serializable { private String id; private String mp3Name; private String mp3Size; private String lrcName; private String lrcSize; public Mp3Info(String id, String mp3Name, String mp3Size, String lrcName, String lrcSize) { super(); this.id = id; this.mp3Name = mp3Name; this.mp3Size = mp3Size; this.lrcName = lrcName; this.lrcSize = lrcSize; } public Mp3Info() { super(); } @Override public String toString() { return "Mp3Info [id=" + id + ", mp3Name=" + mp3Name + ", mp3Size=" + mp3Size + ", lrcName=" + lrcName + ", lrcSize=" + lrcSize + "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getMp3Name() { return mp3Name; } public void setMp3Name(String mp3Name) { this.mp3Name = mp3Name; } public String getMp3Size() { return mp3Size; } public void setMp3Size(String mp3Size) { this.mp3Size = mp3Size; } public String getLrcName() { return lrcName; } public void setLrcName(String lrcName) { this.lrcName = lrcName; } public String getLrcSize() { return lrcSize; } public void setLrcSize(String lrcSize) { this.lrcSize = lrcSize; }
a.在编程中,对于这种专门用于存储某种实体对象的属性的类,都可以用上面的方法进行处理:
1.将每个属性定义为一个私有变量
2.自动生成get函数,set函数和构造函数的功能
3.自动生成toString函数
b.这里Mp3Info类定义了一个Serializable接口,使用序列化,为了保存内存中的实例变量并且可以把保存的实例变量给读取出来,具体的内容可以参考《附》
3. Mp3ListActivity中通过SAX解析resources.xml中的信息,代码如下:
private List<Mp3Info> parse(String xmlStr){ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); List<Mp3Info> infos = new ArrayList<Mp3Info>(); try{ XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader(); Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(infos); xmlReader.setContentHandler(mp3ListContentHandler); xmlReader.parse(new InputSource(new StringReader(xmlStr))); for(Iterator iterator = infos.iterator();iterator.hasNext();){ Mp3Info mp3Info = (Mp3Info)iterator.next(); System.out.println(mp3Info); } }catch(Exception e) { e.printStackTrace(); } return infos; }
a.新建一个SAXParserFactory的工厂类
b.通过该工厂类产生一个SAX的解析类SAXParser
c.从SAXParser中得到一个XMLReader实例
d.将mp3ListContentHandler注册到XMLReader中
e.将xml资源变成一个JAVA可处理的InputStream留,解析开始
4.通过ListView将服务器上的xml内容显示出来
这里我要用到List<HashMap<String ,String>>以及 SimpleAdapter。先上代码:
private void updateListView() { //下载包含所有MP3基本信息的xml文件 String xml = downloadXML("http://10.0.2.2:8080/mp3/resources.xml"); //对xml进行解析,并将解析结果放置在mp3Info对象当中,最后将mp3Info对象放置到list当中 mp3Infos = parse(xml); //生成list对象,按照SimpleAdapter标准,将mp3Info当中的数据添加到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 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}); //将SimpleAdapter对象设置到ListActivity当中 setListAdapter(simpleAdapter); }
a.通过迭代并且设置value和对应的key值,将其存放在SimpleAdapter中,然后再set到list中,这样可以显示出ListView中的内容
5.Menu
点击Menu按键出现选项菜单,其内容有更新列表和退出。需要用到的2个函数为:onCreateOptionsMenu和onOptionsItemSelected,代码如下:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. menu.add(0,UPDATE,1,R.string.mp3list_update); menu.add(0,ABOUT,2,R.string.mp3list_about); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId() == UPDATE){ updateListView(); } else if(item.getItemId() == ABOUT){ } return super.onOptionsItemSelected(item); }
a.onCreateOptionsMenu(Menu menu),此方法用于初始化菜单,其中的menu参数就是要即将显示的Menu实例,返回为true则显示menu,返回false则不显示,只在第一次初始化 菜单调用
b.onOptionsItemSelected(MenuItem item),此方法是菜单项监听,每次菜单项被点击,则要调用一次onOptionsItemSelected(MenuItem item)方法,item参数即为被点击的菜 单项,因此需要在此方法中判断是哪个菜单项被点击,并且根据点击的不同菜单项响应不同的事件
c.menu.add (int groupId, int itemId, int order, int titleRes)
groupId:组别
itemId:Unique item ID,Android根据这个Id来确定不同的菜单
order:顺序
titleRes:Resource identifier of title string
下次将介绍本地local的界面的代码,留意~谢谢!
附: SAX解析的相关资料:
http://www.iteye.com/topic/763895
http://www.cnblogs.com/felix-hua/archive/2012/01/10/2317404.html
http://blog.163.com/liyinhui20080527@126/blog/static/815232582012114115014900/
序列化的相关资料:
http://developer.51cto.com/art/200908/147650.htm
http://xiebh.iteye.com/blog/121311
ListView的相关资料:
http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html
http://blog.csdn.net/hellogv/article/details/4542668
menu的相关资料:
http://android.yaohuiji.com/archives/636
http://www.cnblogs.com/giuz/archive/2010/10/19/1855235.html
http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html