• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
百分百
http://www.qrw100.com
博客园    首页    新随笔    联系   管理    订阅  订阅

自定义Android ListView控件:ExpandableListView

一个比较实用的EapandableListView,样式如附件:

ExpandableListView.png(9.45 K)
2010-9-23 22:04:36



1、在xml添加EapandalbeListView,然后添加一个每项的内容  search_result_item.xml

Main.xml代码

<ExpandableListView android:id="@+id/searchResultsort"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    style="@style/view"
    android:background="#FFFFFF" />...

 

2、代码片段

Main代码

public class Main extends LinearLayout implements ImageRecyle
{
        /**
        * 封装分类的搜索结果类的实例
        */
        private ExpandableListView listView;
        private SearchExpandableAdapter seadapter;
        /**
        * 上下文对象  
        */
        private Context mContext;
        /**
        * 选项被选中是的背景色
        */
        public static final int SELECTED_ITEM_COLOR = 0xFFaaddFF;
        
        /**
        * 构造函数
        * 
        * @param context  上下文对象  
        */
        public SearchResultSort(final Context context)
        {
                super(context);
                
                mContext = context;
                
                // 获取页面布局
                View mainView = LayoutInflater.from(context).inflate(
                                R.main, this);
                // 获取封装好的搜索结果列表
                listView = (ExpandableListView) findViewById(R.id.searchResultsort);
                seadapter=new SearchExpandableAdapter(mContext);
                listView.setAdapter(seadapter);
                // 获取搜索列表的分组数量
                int groupCount = listView.getCount();
                if (groupCount > 0)
                {
                        // 展开第一个组
                        listView.expandGroup(0);
                }
                // 设置子元素被点击的事件监听
                listView.setOnChildClickListener(new OnChildClickListener()
                {
                        
                        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                            int childPosition, long id)
                        {
                        //对选中项进行操作                                // 将所有的列表项中的颜色清空
                                int visStart = listView.getFirstVisiblePosition();
                                int visEnd = listView.getLastVisiblePosition();
                                View viewTemp;
                                for (int i = 0; i <= visEnd - visStart; i++)
                                {
                                        viewTemp = listView.getChildAt(i);
                                        if (viewTemp != null && viewTemp.getTag() != null)
                                        {
                                                viewTemp.setBackgroundColor((Integer) viewTemp.getTag());
                                        }
                                }
                                
                                // 设置点击的子元素
                                listView.setSelectedChild(groupPosition, childPosition, true);
                                
                                // 设置被点击子元素的背景颜色
                                v.setBackgroundColor(SELECTED_ITEM_COLOR);
                                return true;
                        }
                });
        }
        /**
        * 分类列表适配器
        */
        private class SearchExpandableAdapter extends BaseExpandableListAdapter
        {
                // 上下文对象
                private Context mContext;

                // 分类的组集合
                private String[] groups =
                { "Music(3", "Video(5" };

                /**
                * 构造函数
                * 
                * @param context  上下文对象 
                */
                public SearchExpandableAdapter(Context context)
                {
                        super();
                        mContext = context;
                }

                /**
                * 获取子元素对象
                * 
                * @param groupPosition 子元素所在的组集合位置
                * @param childPosition 子元素所在元素集合的位置
                * @return  子元素对象  
                */
                public Object getChild(int groupPosition, int childPosition)
                {
                        return null;
                }

                /**
                * 获取子元素所在元素集合的位置
                * 
                * @param groupPosition 子元素所在的组集合位置
                * @param childPosition 子元素所在元素集合的位置
                * @return  子元素所在元素集合的位置 
                */
                public long getChildId(int groupPosition, int childPosition)
                {
                        return childPosition;
                }

                /**
                * 获取给定组的子元素的个数
                * 
                * @param groupPosition 组的位置
                * @return  该组子元素的个数 
                */
                public int getChildrenCount(int groupPosition)
                {
                        return picIds[groupPosition].length;
                }

                /**
                * 获取组的视图
                * 
                * @return  组的视图  
                */
                public TextView getGroupView()
                {
                        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                                        ViewGroup.LayoutParams.FILL_PARENT, 38);
                        TextView textView = new TextView(mContext);
                        textView.setBackgroundResource(R.drawable.search_bg_list_small);
                        textView.setTextSize(14f);
                        textView.setLayoutParams(lp);
                        textView.setTextColor(0xBB000000);
                        textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
                        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                        textView.setPadding(35, 0, 0, 0);
                        return textView;
                }

                /**
                * 获取分组的视图
                * 
                * @param groupPosition 分组的位置
                * @param isExpanded 是否已经展开
                * @param convertView 转换视图
                * @param parent 父元素视图
                * @return  分组的视图
                */
                public View getGroupView(int groupPosition, boolean isExpanded,
                                View convertView, ViewGroup parent)
                {
                        TextView textView = getGroupView();
                        textView.setText(getGroup(groupPosition).toString());
                        return textView;
                }

                /**
                * 获取子元素的视图
                * 
                * @param groupPosition 子元素所在的组集合位置
                * @param childPosition 子元素所在元素集合的位置
                * @param isLastChild 是否是最后一个子元素
                * @param convertView 转换视图
                * @param parent 父元素视图
                * @return 子元素的视图  
                */
                public View getChildView(int groupPosition, int childPosition,
                                boolean isLastChild, View convertView, ViewGroup parent)
                {
                        ImageView listImage;
                        TextView searchTitle;
                        TextView searchSinger;
                        TextView searchPay;
                        
                        final RatingBar searchStars;

                        if (convertView == null)
                        {//获得view
                                convertView = LayoutInflater.from(mContext).inflate(
                                                R.layout.search_result_item, parent, false);
                        }
                        listImage = (ImageView) convertView.findViewById(R.id.searchImage);
                        searchTitle = (TextView) convertView.findViewById(R.id.searchTitle);
                        searchStars = (RatingBar) convertView
                                        .findViewById(R.id.searchStars);
                        searchPay = (TextView) convertView.findViewById(R.id.searchPay);

                        if (listImage != null)
                        {
                          Bitmap temp = BitmapFactory.decodeResource(mContext
                                                        .getResources(), picIds[groupPosition][childPosition]);
                                        listImage.setImageBitmap(temp);
                        }                

                        if (searchTitle != null)
                        {
                                String ellipsisStr = (String) TextUtils.ellipsize(
                                                titles[groupPosition][childPosition],
                                                (TextPaint) searchTitle.getPaint(), 150,
                                                TextUtils.TruncateAt.END);
                                searchTitle.setText(ellipsisStr);
                                ellipsisStr = (String) TextUtils.ellipsize(
                                                singers[groupPosition][childPosition],
                                                (TextPaint) searchTitle.getPaint(), 150,
                                                TextUtils.TruncateAt.END);
                                searchSinger.setText(ellipsisStr);
                        }

                        if (searchStars != null)
                        {
                                searchStars.setNumStars(5);
                                searchStars.setRating(stars[groupPosition][childPosition]);
                        }
                        
                        if (childPosition % 2 == 1)
                        {
                                convertView.setBackgroundColor(0xfff6f6f6);
                                convertView.setTag(0xfff6f6f6);
                        }
                        else
                        {
                                convertView.setBackgroundColor(0xFFFFFFFF);
                                convertView.setTag(0xFFFFFFFF);
                        }

                        return convertView;
                }

                /**
                * 获取组对象
                * 
                * @param groupPosition 所在组的位置
                * @return  组对象  
                */
                public Object getGroup(int groupPosition)
                {
                        return groups[groupPosition];
                }

                /**
                * 获取分组的个数
                * 
                * @return  分组的个数  
                */
                public int getGroupCount()
                {
                        return groups.length;
                }

                /**
                * 获取分组的位置
                * 
                * @param groupPosition 分组的位置
                * @return  分组的位置  
                */
                public long getGroupId(int groupPosition)
                {
                        return groupPosition;
                }

                /**
                * 子元素是否可选
                * 
                * @param groupPosition 子元素所在的组集合位置
                * @param childPosition 子元素所在元素集合的位置
                * @return ture 
                */
                public boolean isChildSelectable(int groupPosition, int childPosition)
                {
                        return true;
                }

                public boolean hasStableIds()
                {
                        return true;
                }
        }

        // 组包含的子元素集合
        private String[][] titles =
        {
                        { "Scarborough Fair", "Gloomy Sunday", "Fleurs Du Mai" },
                        { "Time ", "You", } };

        private int[][] picIds =
        {
                        { R.drawable.pic_list_01, R.drawable.pic_list_02,
                                        R.drawable.pic_list_03 },
                        { R.drawable.pic_list_04, R.drawable.music_list_06,
                                        R.drawable.music_list_13 }};

        private float[][] stars =
        {
        { 4, 5, 4 },
        { 4, 4 } };

 

search_result_item.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="145px" android:gravity="center_vertical">
    <LinearLayout android:orientation="horizontal"
        android:layout_width="fill_parent" android:gravity="center"
        android:layout_marginRight="17px" android:layout_marginLeft="17px"
        android:layout_height="144px">
        <LinearLayout android:orientation="vertical"
            android:layout_width="88px" android:background="@drawable/book_biankuang"
            android:layout_height="122px" android:gravity="center">
            <ImageView android:id="@+id/mobile_search_book_pic"
                android:layout_width="86px" android:layout_height="120px"
                style="@style/font_style_black_normal" android:src="@drawable/mobile_bookpic" />
        </LinearLayout>
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent" android:layout_marginLeft="30dip"
            android:layout_height="fill_parent" android:gravity="center">
            <RelativeLayout android:orientation="horizontal"
                android:layout_width="fill_parent" android:layout_height="wrap_content">
                <TextView android:id="@+id/mobile_search_text_bookname"
                    android:layout_width="300px" android:layout_height="wrap_content"
                    android:singleLine="true" style="@style/mobile_font_style_black_title_big"
                    android:text="@string/mobilebookstore_book_unknown" />
                <ImageView android:id="@+id/mobile_search_star"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_alignParentRight="true" android:singleLine="true"
                    style="@style/font_style_black_normal" android:src="@drawable/star_zero" />
            </RelativeLayout>
            <RelativeLayout android:orientation="horizontal"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:layout_marginTop="15dip">
                <TextView android:id="@+id/temp_id_c" android:layout_width="wrap_content"
                    android:layout_height="wrap_content" style="@style/mobile_font_style_black_middle"
                    android:text="@string/mobilebookstore_book_author" />
                <TextView android:id="@+id/mobile_search_text_authorname"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_marginLeft="7px" android:layout_toRightOf="@id/temp_id_c"
                    style="@style/mobile_font_style_black_middle" android:text="@string/mobilebookstore_book_unknown" />
                <TextView android:id="@+id/mobile_search_text_price"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    style="@style/mobile_font_style_black_middle" android:text="@string/mobilebookstore_book_unknown" />
                <TextView android:id="@+id/unknown_info"
                    android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:layout_toLeftOf="@id/mobile_search_text_price" style="@style/mobile_font_style_black_middle"
                    android:text="@string/mobilebookstore_book_price" />
            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>
    <ImageView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:gravity="left"
        style="@style/font_style_black_normal" android:src="@drawable/dashed" />
</LinearLayout>

 

posted @ 2011-11-11 17:49  爱尚美  阅读(1320)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3