`

自定义Android ListView控件:ExpandableListView

    博客分类:
  • UI
阅读更多

 

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

 
分享到:
评论

相关推荐

    Android自定义控件下拉刷新上拉加载,所有View通用.(直接拿来用)

    Android自定义控件下拉刷新上拉加载,所有View通用.(直接拿来用).实现了ListView、GridView、ExpandableListView、ScrollView、WebView、ImageView、TextView的下拉刷新和上拉加载

    android 基础控件大全 二维码 6.0权限获取应有尽有

    1 基础控件的使用(CheckBox,RadioButton,RadioGroup,ToggleButton,CheckedTextView,ProgressBar,SeekBar,RatingBar,时间控件,EditText,WebView,ListView,RecyclerView,ExpandableListView,Spinner); 2 二维码 ...

    ExpandableListView:仿京东购物车折叠listview列表

    其实在我没有接触过ExpandableListView类之前,都是自定义控件继承于ListView或者ListView嵌套ListView来实现的, 当然也不推荐大家这样使用, 这样使用会降低app页面的加载速度和性能. 然后,后来发现了Android也给...

    安卓源码包android web应用OCR图像识别listview相关EditText输入框Launcher 桌面45个合集

    安卓源码包android web应用Dialog对话框OCR图像识别listview相关EditText输入框Launcher 桌面45个合集: [四次元]Android Launcher 桌面分页滑动代码.rar [四次元]Android Launcher 源码修改可编译.rar [四次元]...

    自己实现的android树控件treeview

    不过可能是谷歌考虑到android是手机系统,界面宽度有限,所以只提供了只有二级的ExpandableListView。虽然这个控件可以满足很多需求,但是无数级的树在某些情况下还是需要的,所以我花了一天时间(大部分时间都在...

    swipeloadview:在任意下拉刷新组件中中使用ListView,RecyclerView,GridView,ExpandableListView时,为下拉刷新组件增加上拉加载功能

    默认支持为ListView、RecyclerView、GridView、ExpandableListView等内容组件增加pull load功能,其它控件可自行实现接口来添加支持。 load more包含上拉加载、加载中、加载失败、没有更多的功能。可以实现接口来...

    Android实训实习报告总结.docx

    2.2、android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView、ViewPager、WevView、ExpandableListView、GridView、ScrollView、Horizontal ScrollView、Fragment上下左右拉动刷新,...

    Android编程入门很简单.(清华出版.王勇).part1

    5.3使用列表视图(ListView&ExpandableListView) 5.3.1 使用列表——ListView 5.3.2通过实例学习列表 5.3.3 使用可扩展列表——EXpalldableListView 5.3.4实例——简单使用ExpandableListView 5.3.5实例——深入...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--ExpandableListView(下拉伸缩ListView) |--GridView表格布局的用法 |--httpclient超时 |--info体系 |--Intent启动应用apk安装 |--Intent常用功能 |--IO将输入流转成字节 |--Json读js资源文件 |--layout布局样式之...

    Android编程入门很简单.(清华出版.王勇).part2

    5.3使用列表视图(ListView&ExpandableListView) 5.3.1 使用列表——ListView 5.3.2通过实例学习列表 5.3.3 使用可扩展列表——EXpalldableListView 5.3.4实例——简单使用ExpandableListView 5.3.5实例——深入...

    android开发demo集合

    18、ExpandableListView 分组可展开收缩的ListView 19、Notification 状态栏通知 20、GridView、ImageSwitcher 21、SmsManager 消息管理器,发短信(这里是模拟器只能给其它模拟器发短信) 22、Intent Action、...

    疯狂Android讲义源码

     2.4.10 可展开的列表组件(ExpandableListView) 101  2.4.11 网格视图(GridView)和  图像切换器(ImageSwitcher)  功能和用法 104  2.4.12 画廊视图(Gallery)的功能和  用法 107  2.5 对话框 110  ...

    Android PullToRefreshLayout下拉刷新控件的终结者

    说到下拉刷新控件,网上版本有很多,很多软件也都有下拉刷新功能。有一个叫XListView的,我看别人用过,没看过是咋实现的...由于有时候不仅仅是ListView需要下拉刷新,ExpandableListView和GridView也有这个需求,由于

    强大的RecyclerAdapter框架

    强大的RecyclerAdapter框架(什么是RecyclerView?...比ExpandableListView还要强大,支持多级。 自定义ViewHolder 支持自定义ViewHolder,让开发者随心所欲。 扩展框架 组合第三方框架,轻松实现更多需求定制。

    疯狂Android讲义.part2

    2.4.10 可展开的列表组件(ExpandableListView) 101 2.4.11 网格视图(GridView)和 图像切换器(ImageSwitcher) 功能和用法 104 2.4.12 画廊视图(Gallery)的功能和 用法 107 2.5 对话框 110 2.5.1 使用...

    疯狂Android讲义.part1

    2.4.10 可展开的列表组件(ExpandableListView) 101 2.4.11 网格视图(GridView)和 图像切换器(ImageSwitcher) 功能和用法 104 2.4.12 画廊视图(Gallery)的功能和 用法 107 2.5 对话框 110 2.5.1 使用...

    java版商城源码下载-AndroidNotes:安卓开发笔记

    java版商城源码下载 毕生功力 工具类 名称 说明 来源 星星 目前安卓最全的工具类 25k 基础开发工具类box RxUtils工具类 可能是实现方式标准的StatusBar工具类 ...自定义省略号的textview ...异常优秀的item滑动控件,可实

Global site tag (gtag.js) - Google Analytics