今天分析下主界面的形成,截个图如下:
主界面主要由两部分构成,一个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平台在开源的在线音乐播放,该播放器的主要特色如下: 1. 界面美观,在jamendo播放器中精美的布局的随处可见,大量使用自定义控件和Adapter进行布局,这点可供初学者好好探讨...
Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
jamendo-开源在线音乐
jamendo_一款android开源的在线音乐播放器源代码
Android应用源码之jamendo-开源在线音乐_jamendo
著名的开源音乐播放器jamendo。 写的比较好,有兴趣的同学可以参考一下。
telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器)安卓源码.7z
安卓Android源码——jamendo-开源在线音乐.zip
jamendo-开源在线音乐,这是一款来自国外的Android 原生音乐播放APP软件,支持专辑加载,支持各种音乐的播放控制,界面简洁实用,它的价值的是代码的参考性比较大,这个播放软件还可下载音乐,运行视图如截图所示,...
jamendo-开源在线音乐
jamendo-开源在线音乐.zip
jamendo 是全国最大的开源音乐播放器 是android 初学者的好实例 初学者可以通过对jamendo 源码的研究 可以对android'有基础性的认识 jamendo源码可以对四大组件都有 质的的认识和理解
源码参考,欢迎下载
源码参考,欢迎下载
安卓开发-jamendo-开源在线音乐.zip
小程序源码 telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip
Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip
安卓Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip