前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android-ListView 点击展开与收起效果实现

Android-ListView 点击展开与收起效果实现

作者头像
圆号本昊
发布于 2021-09-24 04:27:05
发布于 2021-09-24 04:27:05
1.4K00
代码可运行
举报
文章被收录于专栏:github@hornhuanggithub@hornhuang
运行总次数:0
代码可运行

废话不说先上效果:

实际上这是采用一个ExpandableListView实现的

布局文件很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    <!--提示框-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请选择您的类型:"
        android:textSize="30sp"
        android:textColor="#ffffffff"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:background="#ff000000"/>
    <!--定义一个ExpandableListView组件-->
    <ExpandableListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ExpandableListView>
</LinearLayout>

然后就是具体实现:

这里主要是添加几个必须的属性 大多数方法不用重写

参考我代码中的位置稍加改动就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建一个ExpandableListAdapter对象
        final ExpandableListAdapter adapter = new ExpandableListAdapter() {
            int[] logos = new int[]{
                    R.drawable.human1st,
                    R.drawable.human1st,
                    R.drawable.human2nd,
                    R.drawable.human3rd
            };
            private String[] humanTypes = new String[]{
                    "不是人","聪明人","普通人","我这样的人"
            };
            private String[][] humans = new String[][]{
                    {"上仙","大神","荷兰猪"},
                    {"超人","一般聪明人","假的聪明人"},
                    {"努力的人","快乐的普通人","苦逼的普通人"},
                    {"天才","傻逼","蠢萌"}
            };
            //获得制定组的位置、指定子列表项处的字列表项数据
            private TextView getTextView(){
                AbsListView.LayoutParams layoutParams =
                        new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,164);
                TextView textView = new TextView(MainActivity.this);
                textView.setLayoutParams(layoutParams);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(36,0,0,0);
                textView.setTextSize(30);
                return textView;
            }
            @Override
            public void registerDataSetObserver(DataSetObserver observer) {

            }

            @Override
            public void unregisterDataSetObserver(DataSetObserver observer) {

            }

            @Override
            public int getGroupCount() {
                return humanTypes.length;
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                return humans[groupPosition].length;
            }
            //获取制定组位置处的组数据
            @Override
            public Object getGroup(int groupPosition) {
                return humanTypes[groupPosition];
            }

            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return humans[groupPosition][childPosition];
            }

            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }

            @Override
            public boolean hasStableIds() {
                return true;
            }
            //该方法决定每个组选项的外观
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                LinearLayout linearLayout = new LinearLayout(MainActivity.this);
                linearLayout.setOrientation(LinearLayout.HORIZONTAL);
                ImageView logo = new ImageView(MainActivity.this);
                logo.setImageResource(logos[groupPosition]);
                linearLayout.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                linearLayout.addView(textView);
//                linearLayout.setMinimumHeight(50);
                return linearLayout;
            }

            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition,childPosition).toString());
                return textView;
            }

            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }

            @Override
            public boolean areAllItemsEnabled() {
                return false;
            }

            @Override
            public boolean isEmpty() {
                return false;
            }

            @Override
            public void onGroupExpanded(int groupPosition) {

            }

            @Override
            public void onGroupCollapsed(int groupPosition) {

            }

            @Override
            public long getCombinedChildId(long groupId, long childId) {
                return 0;
            }

            @Override
            public long getCombinedGroupId(long groupId) {
                return 0;
            }
        };
        ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.list);
        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(MainActivity.this,"你是一个:" +
                        adapter.getChild(groupPosition,childPosition),Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        expandableListView.setAdapter(adapter);
    }
}

关于往 ListView 上添加新的内容参考这篇

https://blog.csdn.net/qq_43377749/article/details/84109916

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/11/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
林冠宏-指尖下的幽灵
2018/01/03
1.8K0
站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
ExpandableListView简单应用及listview模拟ExpandableListView
  首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛. 看这个效果挺棒吧,其实实现起来也不难,我简单说明下.
xiangzhihong
2018/01/30
1.3K0
ExpandableListView简单应用及listview模拟ExpandableListView
可折叠列表ExpandableListView多级选择
上一期学习了AutoCompleteTextView和MultiAutoCompleteTextView,你已经掌握了吗?本期开始学习ExpandableListView的使用。 一、认识ExpandableListView ExpandableListView 是 ListView 的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。 ExpandableListView的用法与普通 ListView的用法非常相似,只是 Exp
分享达人秀
2018/02/05
2.7K0
可折叠列表ExpandableListView多级选择
Android开发笔记(一百)折叠式列表
经常看朋友圈的动态,有的动态内容较多就只展示前面一段,如果用户想看完整的再点击展开,这样整个页面的动态列表比较均衡,不会出现个别动态占用大片屏幕的情况。同样,查看博客的文章列表也类似,只展示文章开头几行内容,有需要再点击加载全篇文章。 动态列表直接使用ListView,动态内容就得自己写个控件了,自定义控件的难点在于如何把握动态下拉和收起的动画。这里我们要先预习TextView的相关函数,下面是本文用到的方法说明: getHeight : 获取TextView的显示高度。 setHeight : 设置TextView的显示高度。 getLineHeight : 获取每行文本的高度。 getLineCount : 获取所有文本的行数。 如果一开始每条动态默认显示四行,那么默认显示高度是getLineHeight*4,使用setHeight方法即可设置动态的初始显示高度。点击展开动态全文时,就得显示所有行的文本,整个文本的高度是getLineHeight*getLineCount。现在有了每条动态的初始高度,以及动态全文的完整高度,再加个拉伸动画就差不多了。拉伸动画的主要工作是随着时间的推移,给TextView设置渐增或渐减的高度,这要重写Animation的applyTransformation方法。 下面是点击监听器的显示动画代码示例:
aqi00
2019/01/18
2.3K0
Android之ExpandableListView下拉分组的实现
ExpandableListView是android中可以实现下拉list的一个控件,具体的实现方法如下: 首先:在layout的xml文件中定义一个ExpandableListView <LinearLayout android:id="@+id/linearLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" androidrientation="vertical" > <
xiangzhihong
2018/01/26
8040
Android仿淘宝购物车,玩转电商购物车
前言 其实做一个电商购物车,还真不是一个轻松的活。但是只要掌握思路,一步一步来做,就会发现也就这样。废物不多说,直接上效果图 完整代码,github链接,希望能给个星,谢谢 效果图 GIF1.gif
用户2032165
2018/06/05
3K0
【Android从零单排系列二十一】《Android视图控件——ExpandableListView》
小伙伴们,在上文中我们介绍了Android视图组件ListView,本文我们继续盘点,介绍一下视图控件的ExpandableListView。
再见孙悟空_
2023/07/17
6870
android 三级级联筛选列表
实现的思路:左边这个是listView ,右边是两级的expandListView 
再见孙悟空_
2023/02/10
9050
android 三级级联筛选列表
ExpandableListView实现商品列表折叠
简介 在日常的开发中,有可能会遇到需要一些可以展开的列表,比如QQ的好友列表,电商的购物车折叠显示。Android也给我们提供ExpandableListView类,完美实现这样类似的需求, 极大的方
xiangzhihong
2018/01/26
1.6K0
Android之微信朋友圈UI实现--ExpandableListView+GridView
这张图是不是很熟悉,没错这个就是朋友圈,里面有一个,里面的布局我都画出来了,我不知道微信具体怎么实现的,但是我们会用安卓原生的方法去实现这样的布局,并有实实在在的数据。
cMusketeer
2018/08/01
1.3K0
Android之微信朋友圈UI实现--ExpandableListView+GridView
ExpandableListView实例
demo中有三个group item和多个child item,group item包括一个指示器,一个标题和一个按钮。child item包括一个图片,一个标题和一个按钮。先来实现布局文件 1 activity_main.xml
全栈程序员站长
2022/09/07
1.5K0
相关推荐
站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验