`

Jamendo开源在线音乐播放器源码分析之主界面显示Adapter之功劳

阅读更多

 今天分析下主界面的形成,截个图如下:

 主界面

 主界面主要由两部分构成,一个Header和一个ListView,Header部分由一个ViewFlipper构成,主要分三种,一个loading画面,一个Gallery显示,一个获取failed画面,由于重点是下面的listView部分,所以本部分在此就不详细说明了,布局代码如下:

 

		<!-- (0) Loading -->
		<LinearLayout
			android:orientation="vertical" android:layout_width="fill_parent"
			android:layout_height="fill_parent" android:layout_marginLeft="15dip" android:gravity="left|center_vertical">
			<com.teleca.jamendo.widget.ProgressBar android:id="@+id/ProgressBar" android:layout_width="wrap_content" android:layout_height="wrap_content">
			</com.teleca.jamendo.widget.ProgressBar>
		</LinearLayout>
		
		<!-- (1) Gallery -->
		<LinearLayout
			android:orientation="vertical" android:layout_width="fill_parent"
			android:layout_height="fill_parent" android:gravity="center">
			<Gallery
				android:id="@+id/Gallery" android:layout_width="fill_parent"
				android:layout_height="wrap_content" android:spacing="0px"/>
		</LinearLayout>
		
		<!-- (2) Failure -->
		<LinearLayout
			android:orientation="vertical" android:layout_width="fill_parent"
			android:layout_height="fill_parent" android:layout_marginLeft="15dip" android:gravity="left|center_vertical">
			<com.teleca.jamendo.widget.FailureBar android:id="@+id/FailureBar" android:layout_width="wrap_content" android:layout_height="wrap_content">
			</com.teleca.jamendo.widget.FailureBar>
		</LinearLayout>

    下面就是一个ListView,下面来详细说明一下这个ListView的构成:

    我们知道一般ListView显示都离不开Adapter,在此也不例外,或继承自BaseAdapter,然后重写getView方法,或直接调用android已经写好的方法,之所以拿这个来讲,是因为这里稍微有点特殊,它并不是就直接实现getView方法然后,通过调用setAdapter显示,而是在其中添加了一步,将原本能通过一个Adapter显示的分成两部分,加入Browse Jamendo 和Libray这两个TextView,让用户更容易理解,通过分析这个listView的实现,可以加深对Adapter实现方式的理解。

    首先定义一行要显示的Layout,然后定义PurpleEntry这个类,这个类里面主要定义了要显示某一行的一些变量,用于适配,这个和一般实现没什么区别

    

  

public class PurpleEntry {
	private Integer mDrawable;
	private String mText;
	private Integer mTextId;
	private PurpleListener mListener;
	
	public Integer getDrawable() {
		return mDrawable;
	}
	
	public void setDrawable(Integer drawable) {
		mDrawable = drawable;
	}
             . ............
          ..............
              	public PurpleEntry(Integer drawable, Integer text, PurpleListener listener) {
		mDrawable = drawable;
		mTextId = text;
		mListener = listener;
	}
}

  

    接着实现PurpleAdapter 继承自BaseAdapter

   

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;
	}

    在此,我们通过定义ArrayList<PurpleEntry> browseListEntry = new ArrayList<PurpleEntry>();

   

		browseListEntry.add(new PurpleEntry(R.drawable.list_search, R.string.search, new PurpleListener(){
			@Override
			public void performAction() {
				SearchActivity.launch(HomeActivity.this);
			}
		}));

    然后调用setAdapter就可以在listView里面显示了,但是怎么实现如上图所示的分开显示呢?

    在Jamendo中,主要是通过再定义一个SeparatedListAdapter来进行这个工作,我们来看看它是怎么实现的:

    我理解的Adapter过程,首先通过调用getCount()来获得总Row数目,然后对一行调用getView进行绘制,因此要实现在listView里面另外加入两部分,那么对每一部分调用自己的绘图方式,然后在绘制过程中,判断if(position == 0) return headers.getView(sectionnum, convertView, parent);然后单独调用其绘制函数进行绘制。

     看看整个实现过程:

    

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		int sectionnum = 0;
		for(Object section : this.sections.keySet()) {
			Adapter adapter = sections.get(section);
			int size = adapter.getCount() + 1;

			// check if position inside this section and call their Own getView 
			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++;
		}
		return null;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

}

 

	public SeparatedListAdapter(Context context) {
		//此处进行显示Browse Jamendo及library等初始化工作
		headers = new ArrayAdapter<String>(context, R.layout.list_header);
	}
    //String section 表示要显示的文字
	public void addSection(String section, Adapter adapter) {
		this.headers.add(section);
		this.sections.put(section, adapter);
	}

 

分享到:
评论

相关推荐

    Jamendo android开源在线音乐播放器

    Jamendo在线音乐播放器是一款android平台在开源的在线音乐播放,该播放器的主要特色如下: 1. 界面美观,在jamendo播放器中精美的布局的随处可见,大量使用自定义控件和Adapter进行布局,这点可供初学者好好探讨...

    Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载

    Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    jamendo音乐播放器源码

    **jamendo音乐播放器源码解析** jamendo是一款知名的开源音乐播放器,它为用户提供了一个平台,可以在其中发现、收听并支持独立艺术家的音乐作品。由于其源码是开放的,开发者和爱好者可以深入研究其内部机制,学习...

    jamendo_一款android开源的在线音乐播放器源代码

    《jamendo:Android开源在线音乐播放器源代码详解》 jamendo是一款专为Android平台设计的开源音乐播放器,它提供了丰富的在线音乐资源,让用户能够免费享受来自全球各地的独立艺术家创作的音乐。这款应用的独特之处...

    Android应用源码之jamendo-开源在线音乐_jamendo.zip

    《Android应用源码解析:深度探索jamendo开源在线音乐应用》 在当今移动互联网时代,Android平台上的应用程序种类繁多,其中音乐类应用占据了一席之地。本文将深入剖析开源项目"jamendo",它是一款专为Android用户...

    telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器)安卓源码.7z

    《国外开源音乐播放器——telecapoland-jamendo-android源码解析》 开源软件一直以来都是技术社区中的重要组成部分,它们不仅提供了丰富的学习资源,也为开发者提供了创新和改进的基础。本篇文章将深入探讨...

    Android应用源码之jamendo-开源在线音乐.zip

    总之,通过研究"Android应用源码之jamendo-开源在线音乐"的源码,我们可以学习到Android应用开发的诸多技术,包括网络通信、多媒体处理、UI设计、组件交互等。这不仅有助于提升个人技能,也能为未来开发自己的音乐...

    在线音乐播放器完整源码

    本资源提供的是一个基于Android系统的在线音乐播放器的完整源码,名为"telecapoland-jamendo-android-v1.0.0b-35-g847ba33",这将有助于开发者深入理解音乐播放器应用的开发过程和相关技术。 首先,我们来探讨一下...

    国外开源音乐播放器

    - 编程语言:常见的编程语言有Java、C++、Python等,例如,Android平台的开源播放器可能使用Java或Kotlin开发。 - 框架与库:使用跨平台框架如Qt或Flutter,可以实现多平台兼容。音频处理库如FFmpeg用于音频解码和...

    Android应用源码之telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip

    【Android应用源码之telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器)】 这个开源项目是专门为Android平台设计的一个音乐播放器,名为telecapoland-jamendo-android,版本号为6cd07fb。它允许用户浏览...

    jamendo-开源在线音乐

    Jamendo 是一个基于开源理念的在线音乐平台,它为音乐爱好者提供了一个发现、分享和下载独立音乐的全球社区。这个平台的独特之处在于它的所有音乐都遵循 Creative Commons 许可协议,这意味着用户可以自由地聆听、...

    安卓Android源码——jamendo-开源在线音乐.zip

    【Android源码解析——jamendo开源在线音乐应用】 在安卓(Android)开发领域,了解和研究源码是提升技能、优化应用性能的重要途径。这里我们关注的是“jamendo”项目,一个开源的在线音乐应用程序,它允许用户免费...

    应用源码之jamendo-开源在线音乐.zip

    本文将围绕"应用源码之jamendo-开源在线音乐.zip"这一主题,探讨如何通过分析开源项目jamendo的源码来学习Android开发中的关键知识点,特别是对于毕业设计和代码学习者而言,这是一个极具价值的学习资源。...

    Android代码-jamendo-开源在线音乐.zip

    《Android开发:jamendo开源在线音乐项目解析》 在当今数字化时代,音乐已经无处不在,而开源项目为开发者提供了无限可能。今天我们要探讨的是一个名为"jamendo"的开源在线音乐项目,它是一个专为Android平台设计的...

    jamendo-Android开源在线音乐播放APP源码.rar

    jamendo-开源在线音乐,这是一款来自国外的Android 原生音乐播放APP软件,支持专辑加载,支持各种音乐的播放控制,界面简洁实用,它的价值的是代码的参考性比较大,这个播放软件还可下载音乐,运行视图如截图所示,...

    应用源码之telecapoland-jamendo--6cd07fb(国外开源音乐播放器).zip

    【标题】"应用源码之telecapoland-jamendo--6cd07fb(国外开源音乐播放器).zip" 提供的是一个基于Android平台的开源音乐播放器项目,名为Telecapoland-Jamendo。该项目的源代码可以为开发者提供深入理解Android应用...

    安卓Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).rar

    《安卓Android源码分析——以telecapoland-jamendo-android-6cd07fb开源音乐播放器为例》 在移动操作系统领域,安卓Android以其开放性和灵活性吸引了大量的开发者和用户。对于开发者来说,深入理解Android源码是...

    安卓Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip

    《安卓Android源码分析——以telecapoland-jamendo-android-6cd07fb开源音乐播放器为例》 在移动操作系统领域,安卓Android以其开放性和灵活性吸引了大量的开发者和用户。对于那些热衷于深入理解系统运行机制或者...

    jamendo-开源在线音乐.zip

    【jamendo - 开源在线音乐】是一个专注于提供免费、合法且开源音乐的平台。这个压缩包文件"jamendo-开源在线音乐.zip"很可能是包含了与jamendo相关的应用程序、文档或者其他资源,尤其是考虑到它被标记为"android",...

Global site tag (gtag.js) - Google Analytics