JamemdoPlayer分析一,HomeActivity的自制下拉列表


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包含了自制列表。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值