ExpandableListView的使用

Expandable意思我们理解为可扩展的。需要注意的就是Adapter中各个View的填充。
ExpandableListView使用场景就是类似于QQ上的分组,点击可展开显示列表项,效果图如下:

这里写图片描述


需要资源如下:

  1. 左侧头像资源(自行复制加入Drawable文件夹)
  2. 昵称资源(Strings.xml加入String-array资源)
  3. 个性签名(Strings.xml加入String-array资源)

代码如下:
res-values下修改Strings.xml

Strings.xml

<resources>
    <string name="app_name">ExpandableListViewDemo</string>
    <string-array name="list">
        <item>我欲乘风(王麻子)</item>
        <item>勇往直前(刘能)</item>
        <item>意义(王五)</item>
        <item>十年(李四)</item>
        <item>此处应有(张三)</item>
        <item>无名山(张的)</item>
        <item>放弃(李总)</item>
    </string-array>
    <string-array name="list2">
        <item>每一天都是新的开始!!!</item>
        <item>努力做最好的自己!</item>
        <item>活着就是做有意义的事。</item>
        <item>十年之后,我来找你。</item>
        <item>无话不说</item>
        <item>一个人</item>
        <item>没那么简单</item>
    </string-array>
    <array name="friend">
        <item>我的好友</item>
    </array>
</resources>

MainActivity.java

package com.alphathink.qq311;


import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //构造Adapter
        ExpandableListAdapter adapter = new ExpandableListAdapter() {

            //获取列表名字
            private String[] types = getResources().getStringArray(R.array.friend);

            //二维数组存储昵称+个性签名
            private String[][] names = {getResources().getStringArray(R.array.list),
                    getResources().getStringArray(R.array.list2)};

            //头像信息
            private int[] pics = new int[]{
                    R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4,
                    R.drawable.image5,R.drawable.image6,R.drawable.image7
            };

            //定义分组上显示字体信息
            private TextView getTextView(){
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                       ViewGroup.LayoutParams.MATCH_PARENT,150);
                TextView textView = new TextView(MainActivity.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL);
                textView.setPadding(120,0,0,0);
                textView.setTextSize(20);
                return textView;
            }

            //这两个方法是注册和解除注册观察者模式,方便通知数据改变,这里没有用到
            @Override
            public void registerDataSetObserver(DataSetObserver observer) {

            }

            @Override
            public void unregisterDataSetObserver(DataSetObserver observer) {

            }

            //获取分组数目 这里type.length = 1,所以只显示一个列表项
            @Override
            public int getGroupCount() {
                return types.length;
            }

            //获取子列表数目
            @Override
            public int getChildrenCount(int groupPosition) {
                return names[groupPosition].length;
            }

            //获取分组名称
            @Override
            public Object getGroup(int groupPosition) {
                return types[groupPosition];
            }

            //指定位置列表项数据
            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return names[groupPosition][childPosition];
            }

            //获取组列表id
            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }

            //获取子视图id
            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }

            //通过设置返回false再getView重量级操作时会执行类似局部刷新的效果来优化响应
            @Override
            public boolean hasStableIds() {
                return true;
            }

            /**
             * 这个方法获取分组的信息,解析并显示分组的信息,不涉及分组下的子项目
             * @param groupPosition
             * @param isExpanded
             * @param convertView
             * @param parent
             * @return
             */
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                                     View convertView, ViewGroup parent) {
                LinearLayout ll = new LinearLayout(MainActivity.this);
                ll.setOrientation(LinearLayout.HORIZONTAL);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }

            /**
             * 这个方法用来显示分组下的子项目信息
             * @param groupPosition
             * @param childPosition
             * @param isLastChild
             * @param convertView
             * @param parent
             * @return
             */
            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                                     View convertView, ViewGroup parent) {
                //此处基本上都是利用java代码布置layout布局,以及数据填充等操作,布局设计比较费神,理清思路一层一层来就是
                RelativeLayout relativeLayout = new RelativeLayout(MainActivity.this);
                relativeLayout.setPadding(10,10,10,10);
                RelativeLayout.LayoutParams a = new RelativeLayout.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
                ImageView img = new ImageView(MainActivity.this);
                img.setPadding(20,10,10,10);
                img.setImageResource(pics[childPosition]);

                LinearLayout b = new LinearLayout(MainActivity.this);
                b.setOrientation(LinearLayout.VERTICAL);

                relativeLayout.addView(img,a);
                RelativeLayout.LayoutParams ll = new RelativeLayout.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
                ll.setMargins(200,5,0,0);
                ll.addRule(LinearLayout.VERTICAL);
                TextView textView = new TextView(MainActivity.this);
                textView.setText(getChild(groupPosition,childPosition).toString());

                TextView textView2 = new TextView(MainActivity.this);
                //返回+1操作主要是前边定义的数组签名资源在后一项中
                textView2.setText(names[groupPosition+1][childPosition]);
                b.addView(textView,ll);
                b.addView(textView2,ll);
                relativeLayout.addView(b);

                return  relativeLayout;
            }

            //子选项是否选中
            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return false;
            }

            @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 listView = (ExpandableListView) findViewById(R.id.expand_list);
        listView.setAdapter(adapter);

    }

}

布局文件只需加入ExpandableListView控件即可
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.alphathink.qq311.MainActivity">

    <ExpandableListView
        android:id="@+id/expand_list"
        android:layout_width="368dp"
        android:layout_height="495dp"
        tools:layout_editor_absoluteY="8dp"
        tools:layout_editor_absoluteX="8dp" />

</android.support.constraint.ConstraintLayout>

源码上传到GitHub:https://github.com/NameSpace5/ExpandableListViewDemo.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值