• Android ExpandableListView的使用


    一、MainActivity要继承ExpandableListActivity。效果是当单击ListView的子项是显示另一个ListView。

    package com.example.explear;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.app.ExpandableListActivity;
    import android.os.Bundle;
    import android.transition.SidePropagation;
    import android.widget.SimpleExpandableListAdapter;
    
    public class MainActivity extends ExpandableListActivity {
        private static final String NAME = "NAME";
        private static final String IS_EVEN = "IS_EVEN";
        private SimpleExpandableListAdapter eListAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
            List<List<Map<String, String>>> childDataList = new ArrayList<List<Map<String, String>>>();
            for (int i = 0; i < 10; i++) {
                Map<String, String> curGroupMap = new HashMap<String, String>();
                groupData.add(curGroupMap);
                curGroupMap.put(NAME, "Group" + i);
                curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even"
                        : "this group is odd");
                List<Map<String, String>> children = new ArrayList<Map<String, String>>();
                for (int j = 0; j < 8; j++) {
                    Map<String, String> curChildMap = new HashMap<String, String>();
                    children.add(curChildMap);
                    curChildMap.put(NAME, "Child" + i);
                    curChildMap.put(IS_EVEN, (i % 2 == 0) ? "This chile is even"
                            : "this chile is odd");
                }
                childDataList.add(children);
            }
            eListAdapter = new SimpleExpandableListAdapter(this, groupData,
                    android.R.layout.simple_expandable_list_item_2, new String[] {
                            NAME, IS_EVEN }, new int[] { android.R.id.text1,
                            android.R.id.text2 }, childDataList,
                    android.R.layout.simple_expandable_list_item_2, new String[] {
                            NAME, IS_EVEN }, new int[] { android.R.id.text1,
                            android.R.id.text2 });
            setListAdapter(eListAdapter);
        }
    }

    1、groupData是父数据 ,childDataList是子数据。

    2、android.R.layout.simple_expandable_list_item_2表示list的实现方式

    3、new String[] { NAME,IS_EVEN} list需要显示的数据的键值,真正显示的是键对应的值

    效果图:

    二、数据源:SimpleCursorTreeAdapter的使用

    package com.example.explear;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.app.ExpandableListActivity;
    import android.content.ContentUris;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.Contacts.People;
    import android.transition.SidePropagation;
    import android.widget.ExpandableListAdapter;
    import android.widget.SimpleCursorTreeAdapter;
    import android.widget.SimpleExpandableListAdapter;
    
    public class MainActivity extends ExpandableListActivity {
        private int mGroupIdColumnIndex;
        private String mPhoneNumberProjection[] = new String[] { People.Phones._ID,
                People.Phones.NUMBER };
    
        private ExpandableListAdapter mAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 搜索
            Cursor groupCursor = managedQuery(People.CONTENT_URI, new String[] {
                    People._ID, People.NAME }, null, null, null);
            // 创建ID 列索引
            mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID);
    
            // 创建adapter
            mAdapter = new MyExpandableListAdapter(groupCursor, this,
                    android.R.layout.simple_expandable_list_item_1,
                    android.R.layout.simple_expandable_list_item_1,
                    new String[] { People.NAME }, new int[] { android.R.id.text1 },
                    new String[] { People.NUMBER },
                    new int[] { android.R.id.text1 });
            setListAdapter(mAdapter);
        };
    
        public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
            public MyExpandableListAdapter(Cursor cursor, Context context,
                    int groupLayout, int childLayout, String[] groupFrom,
                    int[] groupTo, String[] childrenFrom, int[] childrenTo) {
                super(context, cursor, groupLayout, groupFrom, groupTo,
                        childLayout, childrenFrom, childrenTo);
            }
    
            @Override
            protected Cursor getChildrenCursor(Cursor groupCursor) {
                // 传进来一个组,返回一个对组内所有子组的cursor
                // 返回一个指向这个联系人电话的箭头
                Uri.Builder builder = People.CONTENT_URI.buildUpon();
                ContentUris.appendId(builder,
                        groupCursor.getLong(mGroupIdColumnIndex));
                builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY);
                Uri phoneNumberUri = builder.build();
    
                return managedQuery(phoneNumberUri, mPhoneNumberProjection, null,
                        null, null);
    
            }
        }
    }

    效果图

    三、通过BaseExpandableListAdapter绑定数据

     activity_main.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="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.explear.MainActivity" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TextView" />
    
        <ExpandableListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >
        </ExpandableListView>
    
    </LinearLayout>

    注意这里的ExpandableListView的id设置需要使用@android:id/list,否则会报

    Your content must have a ExpandableListView whose id attribute is 'android.R.id.list'错误

    package com.example.explear;
    
    import android.R.anim;
    import android.app.ExpandableListActivity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AbsListView;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class MainActivity extends ExpandableListActivity {
        private String[] groups = { "group1", "group2", "group3", "group4" };
        private String[][] children = {
                { "g1 item1", "g1 item2", "g1 item3", "g1 item4" },
                { "g2 item1", "g2 item2", "g2 item3", "g2 item4" },
                { "g3 item1", "g3 item2" }, { "g4 item1", "g4 item2" } };
    
        private ExpandableListView expandableListView;
        private TextView tView = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tView = (TextView) findViewById(R.id.textView1);
            expandableListView = (ExpandableListView) findViewById(android.R.id.list);
    
            BaseExpandableListAdapter adapter = new BaseExpandableListAdapter() {
    
                @Override
                public boolean isChildSelectable(int groupPosition,
                        int childPosition) {
                    String string = groups[groupPosition]
                            + children[groupPosition][childPosition];
                    tView.setText(string);
                    return true;
                }
    
                @Override
                public boolean hasStableIds() {
                    return false;
                }
    
                @Override
                public View getGroupView(int groupPosition, boolean isExpanded,
                        View convertView, ViewGroup parent) {
                    LinearLayout layout = new LinearLayout(MainActivity.this);
                    layout.setOrientation(0);
                    layout.setPadding(50, 0, 0, 0);
                    ImageView imageView = new ImageView(MainActivity.this);
                    imageView.setImageResource(R.drawable.ic_launcher);
                    layout.addView(imageView);
    
                    TextView textView = getTextView();
                    textView.setText(getGroup(groupPosition).toString());
                    layout.addView(textView);
                    return layout;
                }
    
                @Override
                public long getGroupId(int groupPosition) {
                    return groupPosition;
                }
    
                @Override
                public int getGroupCount() {
                    return groups.length;
                }
    
                @Override
                public Object getGroup(int groupPosition) {
                    return groups[groupPosition];
                }
    
                @Override
                public int getChildrenCount(int groupPosition) {
                    return children[groupPosition].length;
                }
    
                @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 long getChildId(int groupPosition, int childPosition) {
                    return childPosition;
                }
    
                @Override
                public Object getChild(int groupPosition, int childPosition) {
                    return children[groupPosition][childPosition];
                }
            };
            expandableListView.setAdapter(adapter);
        }
    
        protected TextView getTextView() {
            AbsListView.LayoutParams lParams = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, 64);
            TextView textView = new TextView(MainActivity.this);
            textView.setLayoutParams(lParams);
            textView.setPadding(20, 0, 0, 0);
            textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
            return textView;
        }
    }

    效果图:

  • 相关阅读:
    SED&AWK
    load average[zhuan]
    To be learned
    Android计时器 android.widget.Chronometer
    Play初识
    获取视图的宽高
    自定义摄像机
    Android VideoView使用小记
    在android中,如何去掉webview读取网页后点击网页上的按钮出现的方框
    阿里云主机试用之自建站点和ftp上传所遇的2个问题
  • 原文地址:https://www.cnblogs.com/six-moon/p/4648964.html
Copyright © 2020-2023  润新知