一。首先介绍ArrayListCursor的使用,该类的可以将ArrayList包装为cursor,从而实现的游标适配器。这里重载了ArrayListCursor,生成一个可以包装自定义数据结构的游标。
- publicArrayListCursor(String[]columnNames,ArrayList<ArrayList<Object>>rows,StringcatagoryColumnNames,Objectcatagory){
-
intcolCount=columnNames.length;
-
booleanfoundID=false;
-
-
for(inti=0;i<colCount;++i){
-
if(columnNames[i].compareToIgnoreCase("_id")==0){
- mColumnNames=columnNames;
-
foundID=true;
-
break;
- }
- }
-
if(!foundID){
-
mColumnNames=newString[colCount+1];
-
System.arraycopy(columnNames,0,mColumnNames,0,columnNames.length);
-
mColumnNames[colCount]="_id";
- }
-
introwCount=rows.size();
-
mRows=newArrayList<ArrayList<Object>>();
-
intindex=-1;
-
for(inti=0;i<columnNames.length;i++){
-
if(columnNames[i]==catagoryColumnNames)
- index=i;
- }
-
if(index==-1)
-
try{
-
thrownewException("invadecolumnname");
-
}catch(Exceptione){
- e.printStackTrace();
- }
-
for(inti=0;i<rowCount;++i){
-
if(!rows.get(i).get(index).equals(catagory))
-
continue;
- mRows.add(rows.get(i));
-
if(!foundID){
- mRows.get(i).add(i);
- }
- }
- }
public ArrayListCursor(String[] columnNames, ArrayList<ArrayList<Object>> rows,String catagoryColumnNames ,Object catagory) {
int colCount = columnNames.length;
boolean foundID = false;
// Add an _id column if not in columnNames
for (int i = 0; i < colCount; ++i) {
if (columnNames[i].compareToIgnoreCase("_id") == 0) {
mColumnNames = columnNames;
foundID = true;
break;
}
}
if (!foundID) {
mColumnNames = new String[colCount + 1];
System.arraycopy(columnNames, 0, mColumnNames, 0, columnNames.length);
mColumnNames[colCount] = "_id";
}
int rowCount = rows.size();
mRows = new ArrayList<ArrayList<Object>>();
int index = -1;
for(int i = 0 ; i < columnNames.length ; i ++){
if(columnNames[i] ==catagoryColumnNames)
index = i;
}
if(index ==-1)
try {
throw new Exception("invade column name");
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < rowCount; ++i) {
if(!rows.get(i).get(index).equals(catagory))
continue;
mRows.add(rows.get(i));
if (!foundID) {
mRows.get(i).add(i);
}
}
}
这里可以加入相应列的列名和其属性值,本来想直接对cursor进行内部属性的过滤,可是google了半天没搞懂怎么直接对包装生成的cursor进行操作。虽然FilterQueryProvider可以实现属性过滤,貌似该类是基于sql语句的从而其层次要低于cursor所在的层次。⊙﹏⊙b汗,搞了好久还是以悲剧结束。
于是在没有别的办法,就自己重载了AbstractCursor类,在构造函数里面实现对属性的过滤。
二。页面解析。在原有的播放器源码上实现在线播放,第一步就是要解析得到所需的资源。首先对这源码表示崇拜一下,没想到内部源码写的真的很完美(就我个人而言),想实现在线播放比较容易,只需要将自己的一些逻辑加进去,该源码已经提供了完整的在线播放的功能。这里首先介绍下百度音乐的解析
- publicstaticArrayList<ArrayList<Object>>parsertoArray(){
- URLurl;
-
try{
-
url=newURL("http://list.mp3.baidu.com/index.html");
-
Stringrex1="<divclass=/"li/">(.*?<span>(.*?)</span>.*?)</div>";
-
Stringrex2=".*?<a.*?href=/"(.*?)/".*?>(.*?)</a>.*?";
- ArrayList<ArrayList<Object>>result=Rex.match(url,rex1,rex2);
-
returnresult;
-
}catch(MalformedURLExceptione){
-
- e.printStackTrace();
-
returnnull;
- }
- }
public static ArrayList<ArrayList<Object>> parsertoArray() {
URL url;
try {
url = new URL("http://list.mp3.baidu.com/index.html");
String rex1 = "<div class=/"li/">(.*?<span>(.*?)</span>.*?)</div>";
String rex2 = ".*?<a.*?href=/"(.*?)/".*?>(.*?)</a>.*?";
ArrayList<ArrayList<Object>> result = Rex.match(url, rex1, rex2);
return result;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
以上代码将歌手,音乐类别和歌曲抽取出来
- classCatagoryCursorAdapterextendsSimpleCursorAdapter{
-
privateintmCatagoryID;
-
publicCatagoryCursorAdapter(Contextcontext,intlayout,Cursorc,
-
String[]from,int[]to,intcatagoryID){
-
super(context,layout,c,from,to);
-
String[]mCursorCols=newString[]{MediaStore.OnLine.ID,
- MediaStore.OnLine.NAME,MediaStore.OnLine.URL,MediaStore.OnLine.CATAGORY_ID,MediaStore.OnLine.CATAGORY_VALUE};
- mCatagoryID=catagoryID;
-
ArrayListCursorcurrentCursor=newArrayListCursor(mCursorCols,currentArray,MediaStore.OnLine.CATAGORY_ID,mCatagoryID);
- changeCursor(currentCursor);
- }
- }
class CatagoryCursorAdapter extends SimpleCursorAdapter{
private int mCatagoryID;
public CatagoryCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to,int catagoryID) {
super(context, layout, c, from, to);
String[] mCursorCols = new String[] { MediaStore.OnLine.ID,
MediaStore.OnLine.NAME, MediaStore.OnLine.URL ,MediaStore.OnLine.CATAGORY_ID,MediaStore.OnLine.CATAGORY_VALUE};
mCatagoryID = catagoryID;
ArrayListCursor currentCursor = new ArrayListCursor(mCursorCols, currentArray,MediaStore.OnLine.CATAGORY_ID,mCatagoryID);
changeCursor(currentCursor);
}
}
通过这个适配其将百度音乐页头的那部分按照android的布局显示出来,具体处理就不细说了。当用户点击一个分类是则显示该类别下的所有音乐,这个暂时未实行。不过点击一个歌手类别时显示该类别下所有歌手已经完成,代码如下
- privatevoidinitCursor(){
-
-
-
Stringrex="<td><span>(.*?)//.</span><ahref=/"(.*?)/".*?>(.*?)</a></td>";
- ArrayList<ArrayList<Object>>result=Rex.match(mOnlineURL,rex);
-
mCursorCols=newString[]{MediaStore.OnLine.ID,MediaStore.OnLine.RANK,
- MediaStore.OnLine.URL,MediaStore.OnLine.NAME};
-
mTrackCursor=newArrayListCursor(mCursorCols,result);
- }
private void initCursor() {
// 创建URL对象
//给定一个URL,例如http://list.mp3.baidu.com/top/top200.html
String rex = "<td><span>(.*?)//.</span><a href=/"(.*?)/".*?>(.*?)</a></td>";
ArrayList<ArrayList<Object>> result = Rex.match(mOnlineURL, rex);
mCursorCols = new String[] { MediaStore.OnLine.ID,MediaStore.OnLine.RANK,
MediaStore.OnLine.URL, MediaStore.OnLine.NAME };
mTrackCursor = new ArrayListCursor(mCursorCols, result);
}
这样播放在线音乐的资源大类已经基本都实现了,接下来就是歌曲资源的解析和播放。
转载于http://ishelf.javaeye.com/admin/blogs/733920
相关推荐
人工智能-深度学习-tensorflow
人工智能毕业设计&课程设计
基于ssm的中小型企业财务管理录系统.zip
这个资源是一个基于Spring Boot和MySQL的洗衣店订单管理系统的完整源码。它包括了所有的源代码文件,以及一个详细的文档,可以帮助你理解和运行这个系统。这个系统的主要功能包括:用户注册和登录,下单,查看订单,修改订单,删除订单等。用户可以在系统中选择洗衣服务,然后提交订单。系统会自动计算订单的总价,并将其显示在用户的订单列表中。用户还可以查看自己的历史订单,以及每个订单的详细信息。此外,系统还包括了一个管理员模块。管理员可以查看所有的订单,以及对订单进行管理。他们可以修改订单的状态,例如将订单标记为已完成,或者取消订单。这个系统使用了Spring Boot框架,这是一个非常流行的Java开发框架,它可以帮助你快速地开发和部署应用程序。同时,系统也使用了MySQL数据库,这是一个广泛使用的关系型数据库,它可以存储大量的数据,并提供高效的查询功能。总的来说,这个资源是一个非常完整的洗衣店订单管理系统的源码,它可以帮助你理解如何使用Spring Boot和MySQL来开发一个实际的应用程序。无论你是正在学习Java编程,还是已经有一定的开发经验,都可以从这个资源中学到很多有用的知识和技能。
W9825G6KH-6I SDRAM,256Mb(32MB,16Mbx16),3.3v 动态随机存取存储器
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
人工智能毕业设计&课程设计
asp代码ASP基于web的学校新闻发布系统开发(论文+源代码+开题报告+文献综述+外文翻译)本资源系百度网盘分享地址
三菱PLC例程源码PLC 气压程式本资源系百度网盘分享地址
三菱PLC例程源码PLC通过RS485 对FR系列变频的控制本资源系百度网盘分享地址
基于ssm的学生档案管理系统.zip
这是一个基于Java语言开发的elfinder 2.x版本Web文件管理器后端设计,包含63个文件,其中主要文件类型包括49个Java源文件、3个XML文件、2个PNG图片文件、2个Markdown文档、1个gitattributes文件、1个gitignore文件、1个LICENSE文件、1个Properties文件、1个types文件和1个未知类型的文件。该项目提供了丰富的文件管理功能,包括自定义文件视图和自定义文件操作,为用户提供了高效、便捷的文件管理体验。
使用DS Client在PPT中动态展示分子三维结构
基于ssm+vue的汽车站车辆运管系统.zip
算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
DS在生物药物领域的解决方案
三菱PLC例程源码SBR废水处理本资源系百度网盘分享地址
人工智能毕业设计&课程设计
人工智能-深度学习-tensorflow
基于ssm电子病历系统.zip