zoukankan      html  css  js  c++  java
  • [Android]BaseExpandableListAdapter实现可折叠列表

    使用BaseExpandableListAdapter 以实现的可折叠的所谓列表,例如QQ朋友们在分组功能。

    基于BaseExpandableListAdapter扩大ExpandableList说明,今天,有两个主要的网上流行:第一种方法是BaseExpandableListAdapter传入两个数组,第一个是表示Group(文件夹头)信息的一维数组,第二个是表示Child(文件夹子项)的二维数组数组;另外一种是构建两个类,一个是表示文件夹信息的GroupInfo类。还有一个是表示子项信息的ChildInfo类,然后传入BaseExpandableListAdapter。通过对照发现,第一种方法因为数组是固定的。而实际项目中往往须要动态变化的文件夹和子项。因此用处不大。另外一种方法文件太多,实现复杂。这里提供一种方法,传递两个个动态的二维数组来实现文件夹结构。



    package com.example.test;
    
    import java.util.ArrayList;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.view.Gravity;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //Group数据
            ArrayList<String> groupList = new ArrayList<String>();
            groupList.add("我的好友");
            groupList.add("我的亲人");
            groupList.add("我的同学");
            //Child数据
            ArrayList<String> itemList1 = new ArrayList<String>();
            itemList1.add("小米");
            itemList1.add("小李");
            ArrayList<String> itemList2 = new ArrayList<String>();
            itemList2.add("小丽");
            itemList2.add("小小");
            itemList2.add("小可");
            ArrayList<String> itemList3 = new ArrayList<String>();
            itemList3.add("小南");
            itemList3.add("小飞");
            itemList3.add("小丁");
            itemList3.add("小美");
            ArrayList<ArrayList<String>> childList = new ArrayList<ArrayList<String>>();
            childList.add(itemList1);
            childList.add(itemList2);
            childList.add(itemList3);
            //可折叠List
            ExpandableListView list = new ExpandableListView(this);
            ExpandableListAdapter mAdapter = new MyExpandableListAdapter(groupList, childList);
            list.setAdapter(mAdapter);
    
            list.setCacheColorHint(0x00000000);
            list.setSelector(new ColorDrawable(Color.TRANSPARENT));
            list.setGroupIndicator(null);
            for (int i = 0; i < mAdapter.getGroupCount(); i++) {
                list.expandGroup(i);
            }
            setContentView(list);
        }
        //Adapter
        private class MyExpandableListAdapter extends BaseExpandableListAdapter {
            private ArrayList<String> groupList;
            private ArrayList<ArrayList<String>> childList;
    
            MyExpandableListAdapter(ArrayList<String> groupList, ArrayList<ArrayList<String>> childList) {
                this.groupList = groupList;
                this.childList = childList;
            }
    
            public Object getChild(int groupPosition, int childPosition) {
                return childList.get(groupPosition).get(childPosition);
            }
    
            private int selectedGroupPosition = -1;
            private int selectedChildPosition = -1;
    
            public void setSelectedPosition(int selectedGroupPosition, int selectedChildPosition) {
                this.selectedGroupPosition = selectedGroupPosition;
                this.selectedChildPosition = selectedChildPosition;
            }
    
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }
    
            public int getChildrenCount(int groupPosition) {
                return childList.get(groupPosition).size();
            }
    
            public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                TextView textView = null;
                if (convertView == null) {
                    textView = new TextView(MainActivity.this);
                    textView.setPadding(32, 10, 0, 10);
                    convertView = textView;
                } else {
                    textView = (TextView) convertView;
                }
    
                textView.setText(getChild(groupPosition, childPosition).toString());
    
                if (groupPosition == selectedGroupPosition) {
                    if (childPosition == selectedChildPosition) {
                        textView.setBackgroundColor(0xffb6ddee);
                    } else {
                        textView.setBackgroundColor(Color.TRANSPARENT);
                    }
                }
    
                textView.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        setSelectedPosition(groupPosition, childPosition);
                        notifyDataSetChanged();
                    }
                });
                return textView;
            }
    
            public Object getGroup(int groupPosition) {
                return groupList.get(groupPosition);
            }
    
            public int getGroupCount() {
                return groupList.size();
            }
    
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }
    
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                LinearLayout cotain = new LinearLayout(MainActivity.this);
                cotain.setPadding(0, 10, 0, 10);
                cotain.setGravity(Gravity.CENTER_VERTICAL);
    
                ImageView imgIndicator = new ImageView(MainActivity.this);
                TextView textView = new TextView(MainActivity.this);
                textView.setText(getGroup(groupPosition).toString());
                textView.setPadding(5, 0, 0, 0);
    
                if (isExpanded) {
                    imgIndicator.setBackgroundResource(R.drawable.bg_arrow_up);
                } else {
                    imgIndicator.setBackgroundResource(R.drawable.bg_arrow_down);
                }
                cotain.addView(imgIndicator);
                cotain.addView(textView);
                return cotain;
            }
    
            public boolean hasStableIds() {
                return true;
            }
    
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    }
    

    groupList 用于组名(类似QQ好友、同学、朋友),

    childList 每个元素是一组子数据的(类似QQ同学约翰·史密斯,收集李四)




  • 相关阅读:
    自动化单元测试工具 EvoSuite 的简单使用
    Dialog lookup method
    微软Axapta中PDF支持中文
    Connected to Ax AOS by code
    Dialog control field event
    Find the tables extending a specific extended data type
    sqlplus不使用服务名,直接使用IP地址连接Oracle
    ATL编写的带窗口的控件,无论VC6(ATL3.0) VC7.1(ATL7.0) 在Windows 7 或 Server 2008 下,WinForm调用时发生的问题
    Ice的slice文件自定义编译命令
    VC9 SP1中新增加的标准 C++ 库中的新功能
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5034084.html
Copyright © 2011-2022 走看看