当前位置:操作系统 > 安卓/Android >>

Jamendo开源在线音乐播放器源码分析(三)

3、AsyncTask
new NewsTask().execute((Void)null);执行一个异步任务,也可以什么参数也不传。异步加载唱片的信息,调用相应的API,后面详说API,加载成功则显示唱片集的gallery,gallery中每一个item是一个自定义的ImageView,这个ImageView可以根据url异步加载唱片图片并缓存,即com.teleca.jamendo.widget.RemoteImageView,后面详说其实现。加载失败则显示retry,并弹出toast提示。
4、适配器adapter
在onResume()方法里的fillHomeListView();这个就是用来填充listview的方法,我们可以看到这个listview中有两种不同的布局,一种是类似分隔符的布局,一种就是可点击的菜单项。先分析下可点击的菜单项的adapter。
com.teleca.jamendo.adapter 包是适配器相关的类。
我们先看下ArrayListAdapter.java,它继承自BaseAdapter,这个adapter中的数据集都是放在ArrayList<T> mList中的,子类继承它覆写自己的getView()方法,程序中可以通过adapter.setList(ArrayList<T> list)或者adapter.setList(T[] list)将特定类型的值填充进去。
可点击的菜单项都是 ArrayListAdapter的一个子类:PurpleAdapter ,填充的类型则是<PurpleEntry>,PurpleEntry中有每一行的drawable和text以及点击后触发的操作。
下面就是整个list包括分隔符的总的adapter:SeparatedListAdapter。
[java]
SeparatedListAdapter separatedAdapter = new SeparatedListAdapter(this); 
separatedAdapter.addSection(getString(R.string.browse_jamendo), mBrowseJamendoPurpleAdapter); 
separatedAdapter.addSection(getString(R.string.my_library), mMyLibraryPurpleAdapter); 
我们进到SeparatedListAdapter 中,看构造方法,先初始化了一个ArrayAdapter<String> headers,这个就是那个分隔符的adapter,addSection(String section, Adapter adapter)是给headers填充值,同时把上面的两个PurpleAdapter 放入map中,再看下getCount()方法,可以看到这个listview总共的条目数,就是除了上面两个PurpleAdapter 的数量,还要加上两个分隔符。下面看下getView()方法,填充的时候主要是调用headers的getView()和每个PurpleAdapter 的getView()方法,主要是逻辑,仔细走流程看懂应该没问题。
下面主要看下3个覆写的方法:
[java]
public int getViewTypeCount() 
public int getItemViewType(int position) 
public boolean isEnabled(int position) 
这三个方法呢 ,你注释掉也是没有关系的,程序也照样能跑,前两个方法主要是缓存listview中item需要用到的,分析源码,在listview的setAdapter()方法中,有个mRecycler这个变量,看它的注释可以知道,这个是用来缓存视图避免下次layout时重新create。mRecycler是ListView的父类AbsListView的一个内部类。往下看,mRecycler.setViewTypeCount( mAdapter.getViewTypeCount( ) );这儿调用了getViewTypeCount()方法,为了初始化这个用于缓存视图的ArrayList,当listview的在填充item时,会调用mRecycler.getScrapView(position),这个方法里会调用getItemViewType(int position)方法,根据返回的类型得到相应的缓存的视图,传递给adapter的getView()方法中的convertView,这样就可以复用了。
回到程序里,这个adapter中的getView()中并没有使用缓存视图即判断convertView是否为空,而是直接生成每一个view,所以这里覆写这两个方法主要是为了服务isEnabled(int position),这个方法是判断这一行能否点击的,用于分隔的headers是不能点击的。当然如果你把这3个方法注释掉了,headers就能点击了,也不会出错,回到HomeActivity的fillHomeListView()中,最后mHomeListView.setOnItemClickListener(mHomeItemClickListener);设置listview的点击事件,如果你点击分隔符headers,程序中会try住这个异常,所以也没事。正常点击的话会调用事先已经设置好的listener中的方法。
下篇分析music API。
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,