`

自定义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 listview,ExpandableListView实现单选,多选,全选,edittext实现批量输入.zip

    在Android开发中,ListView和ExpandableListView是两个常用的视图组件,用于展示可滚动的数据列表。本项目聚焦于如何在这些组件中实现单选、多选、全选功能,并利用EditText进行批量输入操作。以下是对这些知识点的...

    可以扩展的listview--expandablelistview

    在Android开发中,`ExpandableListView`是一种非常实用的视图组件,它允许用户通过点击条目来展开或折叠子列表。这个控件通常用于显示层次结构的数据,比如分类目录、菜单或者像手机QQ分组这样的场景。在这个“可以...

    android listview 自定义样式实例

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。自定义ListView的样式是提高用户体验和个性化应用设计的重要手段。以下将详细介绍如何在Android中实现ListView的自定义样式。 1. **自定义...

    Android常用控件(能折叠的ListView)--ExpandableListView的使用模仿QQ好友

    在Android开发中,ExpandableListView是一个非常实用的控件,它可以模拟折叠效果,类似于QQ好友列表,用户可以展开或收起各个组,显示或隐藏子项。本教程将详细介绍如何在Android应用中使用ExpandableListView来创建...

    Android ListView 选中效果 自定义

    总之,自定义Android ListView的选中效果涉及到Drawable状态选择器、Item布局、Adapter以及事件监听等多个方面。通过灵活运用这些技术,开发者可以创建出各种独特的交互体验,使应用更加吸引人。

    ListView 控件修改源码

    本篇文章将深入探讨如何对Android的ListView控件进行源码修改,以及相关的技术细节。 首先,我们需要了解ListView的基本工作原理。ListView通过Adapter来绑定数据,Adapter负责将数据转化为View显示在列表中。当...

    Android之ExpandableListView控件的使用

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠子项,从而实现层次化的数据展示。这种控件非常适合用来展示具有树状结构的数据,例如菜单、目录或者组织结构等。本篇文章将深入探讨...

    Android中ExpandableListView控件基本使用

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,通常用于展示具有层次结构的数据。这篇博客“Android中ExpandableListView控件基本使用”可能详细介绍了如何在应用程序中有效地...

    ExpandableListView:ExpandableListView在Android中的实现

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,每个分组下可以包含多个子项,非常适合用来展示层次结构的数据。本篇将详细介绍如何在Android中实现`ExpandableListView`,以及...

    Mars老师android第四季自定义Listview源码

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。`Mars老师android第四季自定义Listview源码`这个主题主要是关于如何通过自定义的方式优化和扩展ListView的功能。ListView的自定义通常涉及到...

    ExpandableListView(实现ListView嵌套ListView的效果)

    在Android开发中,`ExpandableListView`是一种非常实用的控件,它允许开发者创建具有可扩展行的列表,也就是我们常说的嵌套列表。这种控件可以用来展示层次结构的数据,比如目录结构、菜单选项或者复杂的分类信息。...

    自定义带CheckBox的ExpandableListView

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠不同的组,每个组下还可以包含多个子项。这个控件在显示层次结构数据时非常有用,例如菜单、设置列表等。而将`CheckBox`与`...

    Android 类似于windows listview的控件

    在Android开发中,ListView是一种非常常见的控件,它与Windows中的ListView控件有着类似的功能,用于展示可滚动的多行数据列表。ListView以其高度可定制性和高效的数据处理能力,成为了展示大量数据的理想选择。本篇...

    android listview 例子

    这个"android listview 例子"着重展示了ListView在实际应用中的复杂使用方式,特别是如何在一个ListView中包含各种不同的控件,以实现丰富的界面效果。 ListView的工作原理基于Adapter模式,Adapter是连接数据源和...

    android ExpandableListView 悬停

    在Android开发中,`ExpandableListView`是一种常用的控件,它扩展了基本的`ListView`功能,允许子项可以展开和折叠,展示更多的详细信息。`ExpandableListView`非常适合用于展示具有层次结构的数据,比如菜单、目录...

    android自定义Listview

    在这个项目中,"android自定义Listview" 涉及到了如何根据实际需求来定制ListView的行为、外观以及交互方式。 一、自定义ListView的基础 1. **Adapter**:ListView的工作原理是通过Adapter来连接数据源与视图。...

    Android开发ListView实现三级菜单

    在Android应用开发中,ListView是一种常用的控件,用于展示大量数据列表。然而,仅使用ListView往往无法满足复杂的界面需求,例如实现多级菜单。在本教程中,我们将深入探讨如何利用ListView嵌套ExpandableListView...

    Android之ExpandableListView控件

    在Android开发中,`ExpandableListView`是一种常用的控件,它扩展了标准的`ListView`功能,允许子项可以被展开或折叠,呈现层次结构的数据。这个控件非常适合用来展示具有树状结构的信息,比如菜单、目录或者组织...

    安卓树形控件相关-Android使用ListView实现一个高性能无限层级显示的树形控件.rar

    在Android SDK中,并没有内置的树形控件,但开发者可以通过自定义View或者利用现有控件如ListView、RecyclerView等来实现。本资料"Android使用ListView实现一个高性能无限层级显示的树形控件"旨在教你如何利用...

    Android基于自定义适配器的ExpandableListView源码.zip

    在Android开发中,ExpandableListView是一个非常实用的控件,它允许用户展示可折叠的子列表,这样的布局常用于层级关系的数据展示,如导航菜单、文件目录等。本压缩包"Android基于自定义适配器的ExpandableListView...

Global site tag (gtag.js) - Google Analytics