可展开的列表组件 ExpandableListview

package com.crazyit.ui.adapterview;

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.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 可展开的列表组件 ExpandableListview
 */
public class ExpandableListviewActivity extends AppCompatActivity {

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

        //创建一个 ExpandableListAdapter对象
        ExpandableListAdapter expandableListAdapter = new BaseExpandableListAdapter() {

            int[] icons = new int[]{R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.libai};
            private String[] armTypes = new String[]{"魏国", "蜀国", "吴国", "晋朝"};

            private String[][] arms = new String[][]{
                    {"曹操", "曹丕", "曹植"},
                    {"刘备", "孔明", "赵云"},
                    {"周瑜", "鲁肃", "陆逊"},
                    {"司马懿", "司马昭", "司马炎"}};

            //获取指定组位置 指定子列表处的子列表数据
            @Override
            public Object getChild(int groupPosition, int childPosition) {


                return arms[groupPosition][childPosition];
            }

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

            @Override
            public int getChildrenCount(int groupPosition) {
                return arms[groupPosition].length;
            }

            private TextView getTextview() {

                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textview = new TextView(ExpandableListviewActivity.this);
                textview.setLayoutParams(lp);
                textview.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textview.setPadding(70, 0, 0, 0); //在此可以设置 图片和文字之间的间隔距离
                textview.setTextSize(24);


                return textview;
            }

            //该方法决定每个子选项的外观
            @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 Object getGroup(int groupPosition) {
                return armTypes[groupPosition];
            }

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

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

            //该方法决定每个组选项的外观
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

                LinearLayout ll = new LinearLayout(ExpandableListviewActivity.this);
                ll.setOrientation(LinearLayout.VERTICAL);
                ImageView logo = new ImageView(ExpandableListviewActivity.this);
                logo.setImageResource(icons[groupPosition]);
                ll.addView(logo);

                TextView tv = new TextView(getApplicationContext());
                tv.setText(getGroup(groupPosition).toString());
                ll.addView(tv);

                return ll;
            }


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

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

        ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.list);
        expandableListView.setAdapter(expandableListAdapter);
    }
}

布局文件

<?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="com.crazyit.ui.adapterview.ExpandableListviewActivity">

    <ExpandableListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/list"
        android:childIndicator="@drawable/nongyu"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        ></ExpandableListView>
    <!--显示在子列表旁边的Drawable对象  android:childIndicator-->
</LinearLayout>

上面程序的关键代码就是扩展 BaseExpandableListAdapter来实现ExpandableListAdapter . 当使用扩展 BaseExpandableListAdapter时,关键是实现如下4个方法.

  1. getGroupCount( );该方法返回包含组列表项的数量.
  2. getGroupView( ); 该方法返回View对象作为组列表项.
  3. getChildrenCount( );该方法返回特定组所包含的子列表项的数量.
  4. getChildView( ); 该方法返回的View对象作为特定组的,特定位置的子列表项.决定每个子选项的外观

上面的代码中 getChildView( )方法中,返回了一个普通的文本(TextView) 因每一个子列表项是都是一个普通文本框, getGroupView( )方法 返回了LinearLayout对象,该LinearLayout包含了一个 ImageView和一个Textview ,因此每个列表项都是由图片和文本组成.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QMUI 是一个 Android UI 库,它提供了一些 UI 组件和工具类,其中包括一个可扩展列表控件 QMUIExpandableListView,使用方法和 ExpandableListView 类似。 在 QMUI 中,展开和收起操作可以通过设置 QMUIExpandableListView.OnGroupClickListener 来实现。具体步骤如下: 1. 获取 QMUIExpandableListView 控件,并创建一个 QMUIExpandableListAdapter 的实现类,实现其中的几个方法,包括获取组数、子项数、组视图、子项视图等。 ```java QMUIExpandableListView expandableListView = findViewById(R.id.expandableListView); QMUIExpandableListAdapter adapter = new QMUIExpandableListAdapter() { @Override public int getGroupCount() { // 获取组数 return 0; } @Override public int getChildrenCount(int groupPosition) { // 获取子项数 return 0; } @Override public Object getGroup(int groupPosition) { // 获取组数据 return null; } @Override public Object getChild(int groupPosition, int childPosition) { // 获取子项数据 return null; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // 获取组视图 return null; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // 获取子项视图 return null; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // 子项是否可选中 return false; } @Override public boolean onInterceptGroupExpandEvent(int groupPosition, boolean isExpanded, int originEvent) { // 在此方法中处理组展开和收起事件 if (isExpanded) { expandableListView.collapseGroup(groupPosition); // 收起 } else { expandableListView.expandGroup(groupPosition); // 展开 } return true; } }; expandableListView.setAdapter(adapter); ``` 在上述代码中,通过实现 QMUIExpandableListAdapter 的方法来提供数据和视图,并将其绑定到 QMUIExpandableListView 上。在 onInterceptGroupExpandEvent 方法中处理组展开和收起事件,如果 isExpanded 为 true,则说明该组已经展开,此时调用 collapseGroup 方法收起,否则调用 expandGroup 方法展开。 在实际使用中,还需要根据数据源来判断组和子项的展开状态,以保持展开状态的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值