ExpandableListView的使用

1.ExpandableListView是可扩展的下拉列表,它的可扩展性在于点击父item可以拉下或收起列表,下面上代码—布局直接用

<RelativeLayout 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"
    tools:context="com.example.administrator.listviewalllist.MainActivity">
    <ExpandableListView
        android:layout_marginLeft="10px"
        android:layout_marginRight="10px"
        android:id="@+id/list_ExpandableListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></ExpandableListView>
</RelativeLayout>

2.主MainActivity使用

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.example.administrator.listviewalllist.Utils.AlertView;
import com.example.administrator.listviewalllist.Utils.OnItemClickListener;

public class MainActivity extends AppCompatActivity implements OnItemClickListener {
    private ExpandableListView list_ExpandableListView;
    //数据源
    public static final String[] BOOKS = {"first", "Second", "Third", "Fourth"};
    public static final String[][] FIGURES = {
            {"Android", "IOS", "Java", "C++"},
            {"Iphone", "三星", "华为", "魅族"},
            {"辛辛苦苦敲代码", "开开心心去旅游", "UNIQUE", "KK", "JC"},
            {"呵呵", "嘻嘻", "哈哈", "恩恩"},
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        list_ExpandableListView = (ExpandableListView) findViewById(R.id.list_ExpandableListView);
        final Adapter adapter = new Adapter(MainActivity.this,BOOKS,FIGURES);
        list_ExpandableListView.setAdapter(adapter);
        list_ExpandableListView.setGroupIndicator(null);//清除默认的图标
        //每次展开一个分组后,关闭其他的分组(接口回调)
        adapter.setOnGroupExpandedListener(new onGroupExpandedListener() {
            @Override
            public void onGroupExpanded(int groupPosition) {
                expandonlyOne(list_ExpandableListView, groupPosition, BOOKS.length);
            }
        });
        //分组点击事件
        list_ExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View view, int groupPosition, long id) {
                boolean groupExpanded = parent.isGroupExpanded(groupPosition);
                adapter.setInt(groupPosition, groupExpanded);
                // 请务必返回 false,否则分组不会展开
                return false;
            }
        });
        //子条目点击事件
        list_ExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
                Toast.makeText(MainActivity.this, "你点击了:" + FIGURES[i][i1], Toast.LENGTH_SHORT).show();
                new AlertView(null,null,"取消",null,new String[]{"实时", "回放"},MainActivity.this, AlertView.Style.ActionSheet,MainActivity.this).show();

                return true;
            }
        });
    }

    private boolean expandonlyOne(ExpandableListView list_expandableListView, int groupPosition, int size) {
        boolean result = true;
        for (int i = 0; i < size; i++) {
            if (i != groupPosition && list_expandableListView.isGroupExpanded(i)) {
                result &= list_expandableListView.collapseGroup(i);
            }
        }
        return result;

    }

    @Override
    public void onItemClick(Object o, int position) {
        if(position==0){
            Toast.makeText(MainActivity.this, "实时", Toast.LENGTH_SHORT).show();
        }if(position==1){
            Toast.makeText(MainActivity.this, "回放", Toast.LENGTH_SHORT).show();
        }
    }
}

3.然后需要自己实现一个Adapte类,用于为ExpandableListView提供数据,该类继承了BaseExpandableListAdapter:

import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Administrator on 2017/9/28 0028.
 */
public class Adapter extends BaseExpandableListAdapter {
    private Context context;
    private String[] groupData;
    private String[][] childData;
    //用于存放Indicator的集合
    private SparseArray<ImageView> mIndicators;
    public onGroupExpandedListener mOnGroupExpandedListener;

    public Adapter(Context context, String[] groupData, String[][] childData) {
        this.context = context;
        this.groupData = groupData;
        this.childData = childData;
        mIndicators = new SparseArray<>();
    }


    public void setOnGroupExpandedListener(onGroupExpandedListener onGroupExpandedListener) {
        mOnGroupExpandedListener = onGroupExpandedListener;

    }
    //根据分组的展开闭合状态设置指示器
    public void setInt(int groupPosition, boolean isExpanded) {
        if (isExpanded) {
            mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_less);
        } else {
            mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_more);
        }

    }

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

    @Override
    public int getChildrenCount(int i) {
        return childData[i].length;
    }

    @Override
    public Object getGroup(int i) {
        return groupData[i];
    }

    @Override
    public Object getChild(int i, int i1) {
        return childData[i][i1];
    }

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

    @Override
    public long getChildId(int i, int i1) {
        return i1;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View view, ViewGroup viewGroup) {
        GroupViewHolder groupViewHolder = new GroupViewHolder();
        if (view == null) {
            view = View.inflate(context, R.layout.item_expand_group_indicator, null);
            groupViewHolder.tvTitle = view.findViewById(R.id.label_group_indicator);
            groupViewHolder.ivIndicator = view.findViewById(R.id.iv_indicator);
            view.setTag(groupViewHolder);
        } else {
            groupViewHolder = (GroupViewHolder) view.getTag();
        }

        groupViewHolder.tvTitle.setText(groupData[groupPosition]);
        mIndicators.put(groupPosition, groupViewHolder.ivIndicator);
        setInt(groupPosition, isExpanded);
        return view;
    }

    @Override
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
        ChildViewHolder childViewHolder = new ChildViewHolder();
        if (view == null) {
            view = View.inflate(context, R.layout.item_expand_child, null);
            childViewHolder.tvTitle = view.findViewById(R.id.label_expand_child);
            view.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) view.getTag();
        }
        childViewHolder.tvTitle.setText(childData[i][i1]);
        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return true;
    }

    @Override
    public void onGroupExpanded(int groupPosition) {

        if (mOnGroupExpandedListener != null) {
            mOnGroupExpandedListener.onGroupExpanded(groupPosition);
        }
    }

    private static class GroupViewHolder {
        TextView tvTitle;
        ImageView ivIndicator;
    }

    private static class ChildViewHolder {
        TextView tvTitle;
    }
}

4.在适配器里面getGroupView()这个方法用来指定父项显示的样式,内容和行为,其中使用了布局item_expand_group_indicator.xml:如下—

<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="wrap_content"
              android:background="#888888"
              android:orientation="horizontal"
              android:padding="8dp">

    <TextView
        android:id="@+id/label_group_indicator"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:paddingLeft="20dp"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        tools:text="测试数据"/>

    <ImageView
        android:id="@+id/iv_indicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@drawable/ic_expand_more"
        />
</LinearLayout>

5.在适配器里面getChildView()这个方法用来指定子项显示的样式,内容和行为,其中使用了布局item_expand_child.xml:如下—

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/label_expand_child"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#e3e3e3"
    android:gravity="center"
    android:paddingBottom="8dp"
    android:paddingTop="8dp"
    android:textSize="16sp"
    tools:text="测试数据" />

6.以上就是ExpandableListView的使用比较简单,下面就来看看效果:
这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值