Android 开发自己的网络收音机3——电台分类(ExpandableListView)_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android 开发自己的网络收音机3——电台分类(ExpandableListView)

Android 开发自己的网络收音机3——电台分类(ExpandableListView)

 2013/7/24 12:40:27  泡泡糖  博客园  我要评论(0)
  • 摘要:上一篇文章说了使用SlidingMenu开源项目实现侧滑栏,今天主要是讲解多级列表ExpandableListView的使用,以及如何使用它实现电台分类管理。ExpandableListView是Android自带的一个实现多级列表的控件,可以理解为ListView的二维实现。下面将针对如何在项目里面使用ExpandableListView进行讲解。(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)ExpandableListView效果图:1
  • 标签:android view list 自己 网络 开发

  上一篇文章说了使用SlidingMenu开源项目实现侧滑栏,今天主要是讲解多级列表ExpandableListView的使用,以及如何使用它实现电台分类管理。ExpandableListView是Android自带的一个实现多级列表的控件,可以理解为ListView的二维实现。下面将针对如何在项目里面使用ExpandableListView进行讲解。

(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

ExpandableListView效果图:

 

 

1、引用ExpandableListView控件


//Edited by mythou
//http://www.cnblogs.com/mythou/
   <ExpandableListView 
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginTop="0dp"
        android:background="@drawable/radio_play_bg2"   //配置外层列表的背景熟悉
        android:divider="@drawable/list_driver"     //外层列表分割线
        android:cacheColorHint="#00000000"        //这个用过listView的应该都知道,避免拖动黑屏
        android:listSelector="@drawable/listview_bg"  //外层List列表项效果
        android:childDivider="@drawable/list_driver"  //子列表分割线效果
        >
    </ExpandableListView>

  上面是我们平常在XML里面配置的属性,这个跟我们一般使用ListView很类似,只是它多了一个子列表项的配置,后面我们会使用代码配置其他一些属性。ExpandableListView用法跟我们普通ListView类似,只是分开了父类ListView和子类ListView。ExpandableListView还有其他的一些属性,有需要可以查看android官网文档。

 

2、继承BaseExpandableListAdapter


//Edited by mythou
//http://www.cnblogs.com/mythou/
public class ChannelListAdapter extends BaseExpandableListAdapter
{
    //设置context
    Context mContext;

    //.............
}

 

继承BaseExpandableListAdapter,编写提供数据的适配器

 

 

3、数据适配器

  我们使用ListView的时候也知道,ListView需要提供一个数据适配器提供数据,ExpandableListView也同样需要一个适配器,我们需要重载BaseExpandableListAdapter基类,编写我们的适配器。其中最主要的是getGroupView()和getChildView()方法,这两个方法分别返回父类列表和子类列表的列表项视图。

 


//Edited by mythou
//http://www.cnblogs.com/mythou/
   @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) 
    {
        //生成一个LinearLayout的布局,这里是外层列表的一个列表项视图
        LinearLayout ll = new LinearLayout(mContext);
     //设置LinearLayout方向 ll.setOrientation(
0);
     //设置列表前面的Logo ImageView logo
= new ImageView(mContext);
     //这里提供一个图片文件作为Logo logo.setImageResource(logos[groupPosition]);
     //设置边距 logo.setPadding(
80, 0, 0, 0);
     //ImageView添加到LinearLayout里面 ll.addView(logo);
     //列表项标题 TextView textView
= getTextView(); textView.setTextColor(Color.WHITE);
     //获取标题资源 textView.setText(getGroup(groupPosition).toString()); ll.addView(textView);
return ll; }

 

  上面返回的View就是我们外层列表的一个列表项,主要包含一个ImageView和TextView控件,使用LinearLayout布局。当然,你也可以使用一个XML文件来布局然后通过Inflate生成一个View返回。两种方法都可以,还有一点需要补充的是,提供的图标资源和Text的文字,这里你可以固定在程序,也可以使用数组提供。我后面因为是关联了电台的数据,所以使用了XML来保存电台数据,然后通过解析XML返回一个ArraryList来提供数据,这个后面我讲电台数据的时候,会仔细讲解。


//Edited by mythou
//http://www.cnblogs.com/mythou/
  @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) 
    {
        //创建布局使用的LinearLayout
        LinearLayout ll = new LinearLayout(mContext);
     //设置布局方向 ll.setOrientation(
0);
     //Logo图片 ImageView generallogo
= new ImageView(mContext); generallogo .setImageResource(generallogos[groupPosition][childPosition]); ll.addView(generallogo);
     //标题资源 TextView textView
= getTextView(); textView.setText(getChild(groupPosition, childPosition) .toString()); ll.addView(textView);
     //返回LinearLayout作为子视图
return ll; }

  上面是二级列表的列表项的视图构造,跟外层列表的构造几乎一样,这里同样构造了一个LinearLayout的布局视图。你也可以编写一个XML的布局,然后加载获取一个View视图返回。同样,这里提供数据的方法,我后面也是改用了XML获取数据,这里先不多说。

  除了上面两个获取视图的方法,剩下几个获取选项的列表数目的方法同样也需要重写,为列表提供数据。


//Edited by mythou
//http://www.cnblogs.com/mythou/
   @Override
    public Object getGroup(int groupPosition) 
    {
        //返回外层列表的对象
        return generalsTypes[groupPosition];
    }

    @Override
    public long getGroupId(int groupPosition) 
    {
        //外层列表当前位置
        return groupPosition;
    }

    @Override
    public int getChildrenCount(int groupPosition) 
    {
        //子列表选项数目
        return generals[groupPosition].length;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) 
    {
        //获取子视图对象
        return generals[groupPosition][childPosition];
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) 
    {
        //子列表当前的位置
        return childPosition;
    }

   这些方法都需要重写,提供我们列表正确的数据,这个跟一般的ListView的Adapter基本类似,只是多了一个父类列表。我们可以根据实际情况重写其他方法。不过上面提到的方法,基本都要重写。才能提供正常的数据给列表使用。

 

 4、总结

  今天主要是讲解一下电台列表的分类,这里主要是借助二级列表实现,第一层列表主要是代表电台分类,第二层列表就是具体每一个分类里面的电台数据。这样分级管理,逻辑上比较清新,而且用户也比较方便查找自己喜欢的电台。下一篇文章会讲解如何通过XML读取数据然后跟我们的电台列表绑定在一起。

 

系列文章:

Android 开发自己的网络收音机1——功能要求及设计方案

Android 开发自己的网络收音机2——电台列表(SlidingMenu侧滑栏)

 

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3207626.html

 

发表评论
用户名: 匿名