Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205381
  • 博文数量: 102
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1015
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-05 16:45
文章存档

2014年(73)

2013年(29)

我的朋友

分类: Android平台

2014-04-06 16:49:43

Mp3Player(7) Mp3ListActivity、onListItemClick

点击(此处)折叠或打开

  1. //Mp3ListActivity.java
  2. package com.lwb.mp3player;

  3. import java.io.StringReader;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;

  8. import javax.xml.parsers.SAXParserFactory;

  9. import org.xml.sax.InputSource;
  10. import org.xml.sax.XMLReader;

  11. import com.lwb.download.HttpDownloader;
  12. import com.lwb.model.Mp3Info;
  13. import com.lwb.mp3player.service.DownloadService;
  14. import com.lwb.xml.Mp3ListContentHandler;

  15. import android.os.Bundle;
  16. import android.app.Activity;
  17. import android.app.ListActivity;
  18. import android.content.Intent;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.view.View;
  22. import android.widget.ListView;
  23. import android.widget.SimpleAdapter;

  24. /*本Activity的作用:从网络上下载歌曲描述文件 显示在 列表Activity上,
  25.  * 可通过点击某歌曲进行下载()
  26.  * 新知识点:
  27.  * 1、从网络上下载歌曲描述文件
  28.  *         下载:xml = downloadXML()
  29.  *         解析文件描述:mp3Infos = parse(xml)
  30.  * 2、更新列表:buildSimpleAdater(mp3Infos);
  31.  * */
  32. //Mp3ListActivity继承了列表型的Activity。ListActivity
  33. public class Mp3ListActivity extends ListActivity {

  34.     private static final int UPDATE = 1;
  35.     private static final int ABOUT = 2;

  36.     private List<Mp3Info> mp3Infos = null;

  37.     // Mp3Info类型是自定义的,用来描述MP3Info的属性
  38.     // 用链表List来装歌曲的信息Mp3Info
  39.     @Override
  40.     protected void onCreate(Bundle savedInstanceState) {
  41.         super.onCreate(savedInstanceState);
  42.         setContentView(R.layout.remote_mp3_list);// 这里设置的布局
  43.         updateListView();// 并从网络获取资源并更新列表
  44.     }

  45.     // 并从网络获取资源并更新列表
  46.     private void updateListView() {
  47.         try{
  48.         String xml = downloadXML("");//下载文件
  49.         // 对xml文件进行解析,并将解析的结果放置在Mp3Info对象当中,最后将这些Mp3对象放置在List中
  50.         mp3Infos = parse(xml);// 解析 得到mp3infos
  51.         buildSimpleAdater(mp3Infos);//更新列表歌曲条目
  52.         }        
  53.         catch (Exception e) {
  54.             System.out.println("*******updateListView()22222222222");
  55.             e.printStackTrace();
  56.         }        
  57.     }

  58.     /* 下载文件xml文件 downloadXML(String urlStr)
  59.      * 其中urlStr是网址
  60.      * 创建一个HttpDownloader
  61.      * 调用HttpDownloader中的download方法
  62.      * */    
  63.     private String downloadXML(String urlStr) {
  64.         HttpDownloader httpDownloader = new HttpDownloader();
  65.         String result = httpDownloader.download(urlStr);
  66.         return result;
  67.     }

  68.     /*List parse(String xmlStr)解析字符串xmlStr所代表的xml文本
  69.      * 1、生成一个SAXParserFactory解析器 :saxParserFactory = SAXParserFactory.newInstance()
  70.      * 2、生成一个XMLReader xml读取对象xmlReader = saxParserFactory.newSAXParser().getXMLReader()
  71.      * 3、创建一个解析规则对象:Mp3ListContentHandler,这个类型是有自己定义的
  72.      * new Mp3ListContentHandler(infos); //注意这里传入了一个infos
  73.      * 4、为xmlReader设置文本内容解析规则xmlReader.setContentHandler(mp3ListContenthandler);
  74.      * 5、进行xmlStr字符串进行解析xmlReader.parse(new InputSorce(new StringReader(xmlStr)))
  75.      *
  76.      * */
  77.     private List<Mp3Info> parse(String xmlStr) {
  78.         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();// 生成一个解析器
  79.         try {
  80.             XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();// 生一个XMLReader对象
  81.             List<Mp3Info> infos = new ArrayList<Mp3Info>();//该List表用于存放在线歌曲信息
  82.             
  83.             // 下面是生成一个Mp3ListContentHandler //定义一个mp3内容处理器 使用Adater处理器实现的
  84.             // 结果是可以得到一个resource.xml 进行解析 得到一首首个的列表
  85.             Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(infos); //注意这里传入了一个infos
  86.             xmlReader.setContentHandler(mp3ListContentHandler);// 这个相当于为xmlReader设置解析函数,哈哈
  87.             xmlReader.parse(new InputSource(new StringReader(xmlStr)));// 对xmlStr字符串进行解析
  88.             for (Iterator iterator = infos.iterator(); iterator.hasNext();) {
  89.                 Mp3Info mp3Info = (Mp3Info) iterator.next();
  90.             }
  91.             return infos;
  92.         } catch (Exception e) {
  93.             e.printStackTrace();
  94.         }
  95.         return null;
  96.     }

  97.     /*buildSimpleAdater()作用是获取 传入参数List中的歌曲的信息生成列表
  98.      * 步骤:
  99.      * 1、创建一个List>
  100.      * 把类型HashMap的 map,添加到表中list.add(map);
  101.      * 注:map是一种键值对
  102.      * map.put("mp3_name", mp3Info.getMp3Name());
  103.      map.put("mp3_size", mp3Info.getMp3Size());
  104.      2、创建一个SimpleAdapter,并传入各种参数
  105.      new SimpleAdapter(this, list,
  106.                 R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size" },
  107.                 new int[] { R.id.mp3_name, R.id.mp3_size });
  108.          this:表这个当前的Mp3ListActivity。
  109.          list:表要显示的内容所在暂存的List表
  110.          R.layout.mp3info_item:表列表的布局
  111.          new String[] { "mp3_name", "mp3_size"},表两列中的关键Key
  112.          new int[] { R.id.mp3_name, R.id.mp3_size }表布局中的两列
  113.         3、设置Adater:setListAdapter(simpleAdapter);        
  114.      * */
  115.     private SimpleAdapter buildSimpleAdater(List<Mp3Info> mp3Infos) {
  116.         // 生成一个List对象,并按照SimpleAdapter的标准,将mp3Infos当中的数据添加到List当中去
  117.         List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
  118.         for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
  119.             Mp3Info mp3Info = (Mp3Info) iterator.next();
  120.             HashMap<String, String> map = new HashMap<String, String>();
  121.             map.put("mp3_name", mp3Info.getMp3Name());
  122.             map.put("mp3_size", mp3Info.getMp3Size());
  123.             list.add(map);
  124.         }
  125.         SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,
  126.                 R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size" },
  127.                 new int[] { R.id.mp3_name, R.id.mp3_size });
  128.         setListAdapter(simpleAdapter);
  129.         return simpleAdapter;
  130.     }

  131.     /*OnListItemClick(ListView l,View v,int position,long id)
  132.      *当点击列表中的某一歌曲时进行下载歌曲,下载歌曲是在另一Service中进行的
  133.      * 其中的position就是被点击歌曲在ListActivity中的序号
  134.      * 重点是 由Activity启动Severce的方法是:
  135.      * 1、生成一个Intent Intent Intent = new Intent()
  136.      * 2、把要传递给Service的信息通过 Intent.putExtra("mp3Info",mp3Info)进行传递
  137.      * 3、设置要启动的Service intent.setClass(this,DownloadService.class);
  138.      * 4、启动Service:startService(intent)
  139.      * */
  140.     @Override
  141.     protected void onListItemClick(ListView l, View v, int position, long id) {
  142.         // 根据用户点击列表当中的位置来得到相应的mp3Info对象
  143.         Mp3Info mp3Info = mp3Infos.get(position);
  144.         // 生成Intent对象
  145.         Intent intent = new Intent();
  146.         // 把Mp3Info对象存入到Intent对象当中
  147.         intent.putExtra("mp3Info", mp3Info);
  148.         intent.setClass(this, DownloadService.class);
  149.         // 启动Service
  150.         startService(intent);
  151.         super.onListItemClick(l, v, position, id);
  152.     }

  153.     /*onCreateOptionMenu(Menu menu)创建菜单
  154.      * 通过 menu.add(0,UPDATE,1,R.string.mp3list_update);
  155.      * 0:不知道是什么
  156.      * UPDATE:表在菜单中出现的次序
  157.      * 1:不知道是什么
  158.      * R.string.mp3list_update:表菜单显示字符串
  159.      * */
  160.     /* 在用户点击MENU按钮之后,会调用该方法,我可以在这里添加我们的控件 */
  161.     @Override
  162.     public boolean onCreateOptionsMenu(Menu menu) {
  163.         menu.add(0, UPDATE, 1, R.string.mp3list_update);
  164.         menu.add(0, ABOUT, 2, R.string.mp3list_about);
  165.         // getMenuInflater().inflate(R.menu.mp3_list, menu); ?????????
  166.         return super.onCreateOptionsMenu(menu);
  167.         // return true;
  168.     }

  169.     // 用户点击菜单按钮回调函数 onOptionsItemSelected(MenuItem item) item就是被点击的项
  170.     @Override
  171.     public boolean onOptionsItemSelected(MenuItem item) {
  172.         if (item.getItemId() == UPDATE) {
  173.             // 用户点击更新按钮
  174.             updateListView();
  175.         } else if (item.getItemId() == ABOUT) {
  176.             // 用户点击了关于按钮
  177.         }
  178.         return super.onOptionsItemSelected(item);
  179.     }
  180. }

阅读(380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~