主要的对象有:
PurpleEntry(这个类是定义每行列表的属性),
//首页上列表的图片资源
private Integer mDrawable;
//显示的标题
private String mText;
//显示标题的资源ID
private Integer mTextId;
//监听器private PurpleListener mListener;
ArrayListAdapter(继承自BaseAdapter)里面定义了一个ArrayList类型的list来存放数据,
PurpleAdapter(这个类是继承自ArrayListAdapter)用来匹配视图,
SeparatedListAdapter(这个类是用来存放各个purpleAdapter,并绑定界面的adapter,继承自BaseAdapter),
下面分析详细过程:
代码中先new出了两个ArrayListAdapter对象来存放不同分组的PurpleEntry(其实就是列表的两个组,BrowseJamendo和MyLibrary),
mBrowseJamendoPurpleAdapter = new PurpleAdapter(this);
mMyLibraryPurpleAdapter = new PurpleAdapter(this);
然后他用两个ArrayList对象来放入各个Purple对象,(每一个ArrayList对象对应一个PurpleAdapter对象)
ArrayList<PurpleEntry> browseListEntry = new ArrayList<PurpleEntry>();
ArrayList<PurpleEntry> libraryListEntry = new ArrayList<PurpleEntry>();browseListEntry.add(new PurpleEntry(R.drawable.list_search, R.string.search, new PurpleListener(){
@Override
public void performAction() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "启动Search模块", Toast.LENGTH_LONG).show();//SearchActivity.launch(MainActivity.this);
}}));
browseListEntry.add(new PurpleEntry(R.drawable.list_radio,R.string.radio,new PurpleListener(){
@Override
public void performAction() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "启动Radio模块", Toast.LENGTH_LONG).show();
}}));
browseListEntry.add(new PurpleEntry(R.drawable.list_top,R.string.most_listened,new PurpleListener(){
@Override
public void performAction() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "启动Most-Listened模块", Toast.LENGTH_LONG).show();}
}));
libraryListEntry.add(new PurpleEntry(R.drawable.list_playlist, R.string.playlists, new PurpleListener(){
@Override
public void performAction() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "启动PlayList模块", Toast.LENGTH_LONG).show();
}}));
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
libraryListEntry.add(new PurpleEntry(R.drawable.list_download,R.string.download, new PurpleListener(){@Override
public void performAction() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "启动downLoad模块", Toast.LENGTH_LONG).show();}
}));
}adapter和Arraylist对象一一对应
mBrowseJamendoPurpleAdapter.setMlist(browseListEntry);
mMyLibraryPurpleAdapter.setMlist(libraryListEntry);
把各个PurpleAdapter存放至SeparatedListAdapter对象中:
SeparatedListAdapter separatedAdapter = new SeparatedListAdapter(this);
separatedAdapter.addSection(getString(R.string.browse_jamendo), mBrowseJamendoPurpleAdapter);
separatedAdapter.addSection(getString(R.string.my_library), mMyLibraryPurpleAdapter);
那么这里PurpleAdapter具体是怎么操作的呢?
在PurpleAdapter里面有两个变量:
private Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>();
public final ArrayAdapter<String> headers;headers:用来存放分组的标题(也就是BrowseJamendo和MyLibrary),
sections:用来存放各个组对应下的adapter对象。
在getview的时候当position等于0的时候就得到标题的视图,然后就得到改标题下的每一行视图。
(当第一的标题BrowseJamendo,position=0,执行的是标题视图,size在第一的标题的时候始终是4,当position=4的时候,
就会执行 position -= size;sectionnum++;把position变成0,sectionnum加1,然后进行下一个标题。
for(Object section : this.sections.keySet()) {
Adapter adapter = sections.get(section);
int size = adapter.getCount() + 1;// check if position inside this section
if(position == 0) return headers.getView(sectionnum, convertView, parent);
if(position < size) return adapter.getView(position - 1, convertView, parent);// otherwise jump into next section
position -= size;
sectionnum++;
}
绑定dapter和监听器
mHomeListView.setAdapter(separatedAdapter);
mHomeListView.setOnItemClickListener(mHomeItemClickListener);
监听器:
private OnItemClickListener mHomeItemClickListener = new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index,
long time) {//相应个歌监听器事件
PurpleListener listener = ((PurpleEntry)adapterView.getAdapter().getItem(index)).getmListener();
if(listener != null){
listener.performAction();
}
}};
至此列表部分分析完成。