HomeActivity的自制下拉列表,是如何实现的?下面就是HomeActivity.java运行后显现的效果。
通过分析,我们可知上面的列表,是通过fillHomeListView(),来实现。而fillHomeListView(),在 onResume()生命周期得到调用,为何在 onResume(),原因是JamemdoPlayer的初始页面是手势教程提示页面(SplashscreenActivity)。另一个原因是从子菜单再返回本页面是也会执行onResume()。
下面重点分析fillHomeListView()
private void fillHomeListView(){
mBrowseJamendoPurpleAdapter = new PurpleAdapter(this);
mMyLibraryPurpleAdapter = new PurpleAdapter(this);
ArrayList<PurpleEntry> browseListEntry = new ArrayList<PurpleEntry>();
ArrayList<PurpleEntry> libraryListEntry = new ArrayList<PurpleEntry>();
//==== BROWSE JAMENDO ====
// browseListEntry.add(new PurpleEntry(R.drawable.list_search, R.string.search, new PurpleListener(){
// @Override
// public void performAction() {
// SearchActivity.launch(HomeActivity.this);
// }
// }));
browseListEntry.add(new PurpleEntry(R.drawable.list_radio, R.string.radio, new PurpleListener(){
@Override
public void performAction() {
RadioActivity.launch(HomeActivity.this);
}
}));
browseListEntry.add(new PurpleEntry(R.drawable.list_top, R.string.most_listened, new PurpleListener(){
@Override
public void performAction() {
new Top100Task(HomeActivity.this, R.string.loading_top100, R.string.top100_fail).execute();
}
}));
//==== MY LIBRARY =========
libraryListEntry.add(new PurpleEntry(R.drawable.list_playlist, R.string.playlists, new PurpleListener(){
@Override
public void performAction() {
BrowsePlaylistActivity.launch(HomeActivity.this, Mode.Normal);
}
}));
// check if we have personalized client then add starred albums
final String userName = PreferenceManager.getDefaultSharedPreferences(this).getString("user_name", null);
if(userName != null && userName.length() > 0){
libraryListEntry.add(new PurpleEntry(R.drawable.list_cd, R.string.albums, new PurpleListener(){
@Override
public void performAction() {
StarredAlbumsActivity.launch(HomeActivity.this, userName);
}
}));
}
// show this list item only if the SD Card is present
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
libraryListEntry.add(new PurpleEntry(R.drawable.list_download, R.string.download, new PurpleListener(){
@Override
public void performAction() {
DownloadActivity.launch(HomeActivity.this);
}
}));
}
/* following needs jamendo authorization (not documented yet on the wiki)
* listEntry.add(new PurpleEntry(R.drawable.list_mail, "Inbox"));
*/
libraryListEntry.add(new PurpleEntry(R.drawable.list_star, R.string.favorites, new PurpleListener(){
@Override
public void performAction() {
Playlist playlist = new DatabaseImpl(HomeActivity.this).getFavorites();
//JamendoApplication.getInstance().getPlayerEngine().openPlaylist(playlist);
JamendoApplication.getInstance().getPlayerEngineInterface().openPlaylist(playlist);
PlaylistActivity.launch(HomeActivity.this, true);
}
}));
// attach list data to adapters
mBrowseJamendoPurpleAdapter.setList(browseListEntry);
mMyLibraryPurpleAdapter.setList(libraryListEntry);
// separate adapters on one list
SeparatedListAdapter separatedAdapter = new SeparatedListAdapter(this);
separatedAdapter.addSection(getString(R.string.browse_jamendo), mBrowseJamendoPurpleAdapter);
separatedAdapter.addSection(getString(R.string.my_library), mMyLibraryPurpleAdapter);
mHomeListView.setAdapter(separatedAdapter);
mHomeListView.setOnItemClickListener(mHomeItemClickListener);
}
请看第一句mBrowseJamendoPurpleAdapter = new PurpleAdapter(this)。PurpleAdapter是什么呢?
PurpleAdapter.java 其中有两句:
holder.image = (ImageView)row.findViewById(R.id.PurpleImageView);
holder.text = (TextView)row.findViewById(R.id.PurpleRowTextView);
这正是注明列表的图标及文字的语句,并通过row.setTag(holder)来实现绑定。row是什么呢?row=inflater.inflate(R.layout.purple_row, null);通过这inflater指向了R.layout.purple_row.xml这个布局文件来具体显示(Home页面你所看到的列表样式)。
//: PurleAdapter.java
public class PurpleAdapter extends ArrayListAdapter<PurpleEntry> {
public PurpleAdapter(Activity context) {
super(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row=convertView;
ViewHolder holder;
if (row==null) {
LayoutInflater inflater = mContext.getLayoutInflater();
row=inflater.inflate(R.layout.purple_row, null);
holder = new ViewHolder();
holder.image = (ImageView)row.findViewById(R.id.PurpleImageView);
holder.text = (TextView)row.findViewById(R.id.PurpleRowTextView);
row.setTag(holder);
}
else{
holder = (ViewHolder) row.getTag();
}
if(mList.get(position).getText() != null){
holder.text.setText(mList.get(position).getText());
} else if(mList.get(position).getTextId() != null){
holder.text.setText(mList.get(position).getTextId());
}
if(mList.get(position).getDrawable() != null){
holder.image.setImageResource(mList.get(position).getDrawable());
} else {
holder.image.setVisibility(View.GONE);
}
return row;
}
/**
* Class implementing holder pattern,
* performance boost
*
* @author Lukasz Wisniewski
*/
static class ViewHolder {
ImageView image;
TextView text;
}
}
那么上面自定义的列表是如何显示在HOME页面的呢?
HomeActivity.java的页面布局是MAIN.XML,下面就是注明列表显示的语句
<ListView android:id="@+id/HomeListView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:divider="#000" />
然后在fillHomeListView()实现绑定:
mHomeListView = (ListView)findViewById(R.id.HomeListView);
mHomeListView.setAdapter(separatedAdapter);
separatedAdapter这个Adapter包含了自制列表。