zoukankan      html  css  js  c++  java
  • Android ExpandableListView 带有Checkbox的简单应用

    expandablelistview2_groups.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true" />
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true" />
    
        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/imageView1"
            android:focusable="false"
            android:focusableInTouchMode="false" />
    
    </RelativeLayout>

    expandablelistview2_child.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true" />
    
        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:clickable="false"
            android:focusable="false"
            android:focusableInTouchMode="false" />
    
    </RelativeLayout>

    Expandablelistview2Activity.java

    package com.wangzhu.demoexpandablelistview;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AbsListView;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.ExpandableListView;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class Expandablelistview2Activity extends Activity {
    
        private final static String TAG = "Expandablelistview2Activity";
        /**
         * 定义组数据
         */
        private List<String> groupDataList;
        /**
         * 定义组中的子数据
         */
        private List<List<String>> childDataList;
    
        private ExpandableListView expandableListView;
        private ExpandableAdapter adapter;
    
        /**
         * 0:不可选 1:未选中 2:半选 3:选中
         */
        private List<Map<Integer, Integer>> isSelectedList;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.expandablelistview1);
            loadData();
            expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
    
            // expandableListView.setGroupIndicator(getResources().getDrawable(
            // R.drawable.indicator_selector));
    
            expandableListView.setGroupIndicator(null);
            adapter = new ExpandableAdapter();
            expandableListView.setAdapter(adapter);
            expandableListView
                    .setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    
                        @Override
                        public void onGroupExpand(int groupPosition) {
                            // 只展开一个
                            for (int i = 0, count = expandableListView.getCount(); i < count; i++) {
                                if (groupPosition != i) {
                                    expandableListView.collapseGroup(i);
                                }
                            }
                        }
                    });
    
            expandableListView
                    .setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    
                        @Override
                        public boolean onChildClick(ExpandableListView parent,
                                View v, int groupPosition, int childPosition,
                                long id) {
                            Toast.makeText(
                                    Expandablelistview2Activity.this,
                                    "onChildClick===="
                                            + adapter.getChild(groupPosition,
                                                    childPosition) + "===="
                                            + v.getParent(), Toast.LENGTH_LONG)
                                    .show();
                            ViewHolder viewHolder = (ViewHolder) v.getTag();
                            viewHolder.checkBox.toggle();
                            if (viewHolder.checkBox.isChecked()) {
                                isSelectedList.get(groupPosition).put(
                                        childPosition, 3);
                            } else {
                                isSelectedList.get(groupPosition).put(
                                        childPosition, 1);
                            }
                            int count = 0;
                            for (int i = 0, size = isSelectedList
                                    .get(groupPosition).size(); i < size; i++) {
                                if (isSelectedList.get(groupPosition).get(i) == 3) {
                                    count++;
                                }
                            }
                            View view = (View) v.getParent();
                            Log.d(TAG, "view=" + view.findViewById(R.id.checkBox1));
                            CheckBox ck = (CheckBox) view
                                    .findViewById(R.id.checkBox1);
                            if (count == isSelectedList.get(groupPosition).size()) {
                                // ck.setBackgroundResource(R.drawable.btn_select);
                                ck.setButtonDrawable(R.drawable.btn_select);
                            } else if (count > 0) {
                                // ck.setBackgroundResource(R.drawable.btn_half);
                                ck.setButtonDrawable(R.drawable.btn_half);
                            } else {
                                // ck.setBackgroundResource(R.drawable.btn_unselect);
                                ck.setButtonDrawable(R.drawable.btn_unselect);
                            }
                            adapter.notifyDataSetChanged();
                            return false;
                        }
                    });
    
            isSelectedList = new ArrayList<Map<Integer, Integer>>();
            for (int i = 0, icount = expandableListView.getCount(); i < icount; i++) {
                Map<Integer, Integer> map = new HashMap<Integer, Integer>();
                for (int j = 0, jcount = childDataList.get(i).size(); j < jcount; j++) {
                    map.put(j, 1);
                }
                isSelectedList.add(map);
            }
        }
    
        /**
         * 全部展开或关闭
         * 
         * @param flag
         */
        private void showOrhide(boolean flag) {
            for (int i = 0, count = expandableListView.getCount(); i < count; i++) {
                if (flag) {
                    expandableListView.expandGroup(i);
                } else {
                    expandableListView.collapseGroup(i);
                }
            }
        }
    
        private void loadData() {
            groupDataList = new ArrayList<String>();
            groupDataList.add("国家");
            groupDataList.add("人物");
            groupDataList.add("武器");
    
            childDataList = new ArrayList<List<String>>();
    
            List<String> child1 = new ArrayList<String>();
            child1.add("魏国");
            child1.add("蜀国");
            child1.add("吴国");
            childDataList.add(child1);
    
            List<String> child2 = new ArrayList<String>();
            child2.add("关羽");
            child2.add("张飞");
            child2.add("典韦");
            child2.add("吕布");
            child2.add("曹操");
            child2.add("甘宁");
            child2.add("郭嘉");
            child2.add("周瑜");
            childDataList.add(child2);
    
            List<String> child3 = new ArrayList<String>();
            child3.add("青龙偃月刀");
            child3.add("丈八蛇矛枪");
            child3.add("青钢剑");
            child3.add("麒麟弓");
            child3.add("银月枪");
            childDataList.add(child3);
        }
    
        private class ExpandableAdapter extends BaseExpandableListAdapter {
    
            @Override
            public int getGroupCount() {
                return groupDataList.size();
            }
    
            @Override
            public int getChildrenCount(int groupPosition) {
                return childDataList.get(groupPosition).size();
            }
    
            @Override
            public Object getGroup(int groupPosition) {
                return groupDataList.get(groupPosition);
            }
    
            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return childDataList.get(groupPosition).get(childPosition);
            }
    
            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }
    
            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }
    
            @Override
            public boolean hasStableIds() {
                return false;
            }
    
            @Override
            public View getGroupView(final int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
    
                Log.d(TAG, "getGroupView");
                ViewHolder viewHolder = null;
                if (null == convertView) {
                    convertView = View.inflate(Expandablelistview2Activity.this,
                            R.layout.expandablelistview2_groups, null);
                    viewHolder = new ViewHolder();
                    viewHolder.textView = (TextView) convertView
                            .findViewById(R.id.textView1);
                    viewHolder.checkBox = (CheckBox) convertView
                            .findViewById(R.id.checkBox1);
                    viewHolder.imageView = (ImageView) convertView
                            .findViewById(R.id.imageView1);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
    
                viewHolder.textView.setText(groupDataList.get(groupPosition));
                viewHolder.checkBox
                        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
                            @Override
                            public void onCheckedChanged(CompoundButton buttonView,
                                    boolean isChecked) {
                                int flag = 0;
                                if (isChecked) {
                                    flag = 3;
                                } else {
                                    flag = 1;
                                }
                                for (int i = 0, size = isSelectedList.get(
                                        groupPosition).size(); i < size; i++) {
                                    isSelectedList.get(groupPosition).put(i, flag);
                                }
                                notifyDataSetChanged();
                            }
                        });
                int size = 0;
                for (int i = 0, count = isSelectedList.get(groupPosition).size(); i < count; i++) {
                    if (isSelectedList.get(groupPosition).get(i) == 3) {
                        size++;
                    }
                }
                if (size == isSelectedList.get(groupPosition).size()) {
                    // viewHolder.checkBox
                    // .setBackgroundResource(R.drawable.btn_select);
                    viewHolder.checkBox.setButtonDrawable(R.drawable.btn_select);
                } else if (size > 0) {
                    // viewHolder.checkBox.setBackgroundResource(R.drawable.btn_half);
                    viewHolder.checkBox.setButtonDrawable(R.drawable.btn_half);
                } else {
                    // viewHolder.checkBox
                    // .setBackgroundResource(R.drawable.btn_unselect);
                    viewHolder.checkBox.setButtonDrawable(R.drawable.btn_unselect);
                }
    
                // 判断isExpanded就可以控制是按下还是关闭,同时更换图片
                if (isExpanded) {
                    viewHolder.imageView
                            .setBackgroundResource(R.drawable.shangiantou);
                } else {
                    viewHolder.imageView
                            .setBackgroundResource(R.drawable.xiajiantou);
                }
    
                return convertView;
            }
    
            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {
    
                Log.d(TAG, "getChildView");
                // TextView textView = null;
                // if (null != convertView) {
                // textView = (TextView) convertView;
                // textView.setText(childDataList.get(groupPosition).get(
                // childPosition));
                // } else {
                // textView = createView(childDataList.get(groupPosition).get(
                // childPosition));
                // }
                // return textView;
    
                ViewHolder viewHolder = null;
                if (null == convertView) {
                    convertView = View.inflate(Expandablelistview2Activity.this,
                            R.layout.expandablelistview2_child, null);
                    viewHolder = new ViewHolder();
                    viewHolder.textView = (TextView) convertView
                            .findViewById(R.id.textView1);
    
                    viewHolder.checkBox = (CheckBox) convertView
                            .findViewById(R.id.checkBox1);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
    
                if (isSelectedList.get(groupPosition).get(childPosition) == 3) {
                    // viewHolder.checkBox
                    // .setBackgroundResource(R.drawable.btn_select);
                    // 更改CheckBox的外观
                    viewHolder.checkBox.setButtonDrawable(R.drawable.btn_select);
                } else {
                    // viewHolder.checkBox
                    // .setBackgroundResource(R.drawable.btn_unselect);
                    viewHolder.checkBox.setButtonDrawable(R.drawable.btn_unselect);
                }
                viewHolder.textView.setText(childDataList.get(groupPosition).get(
                        childPosition));
                return convertView;
            }
    
            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }
    
            private TextView createView(String content) {
                TextView textView = null;
                AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 80);
                textView = new TextView(Expandablelistview2Activity.this);
                textView.setLayoutParams(layoutParams);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(80, 0, 0, 0);
                textView.setText(content);
                return textView;
            }
    
        }
    
        private class ViewHolder {
            TextView textView;
            CheckBox checkBox;
            ImageView imageView;
        }
    }

    所需图片:

    没有好的图标,故随便找了几张先顶一下,嘿嘿!

    Checkbox的半选图标:

    Checkbox的选中图标:

    Checkbox的未选中图标:

    备注:

    是否发现缺少了一个主布局文件(expandablelistview1.xml)?它在我的前一篇中,这两篇所用都是同一个主布局文件。

    简单的实现了一下,请各位多多指教,菜鸟在这儿恭候!

    效果图:

  • 相关阅读:
    五大常用算法之四:回溯法
    五大常用算法之三:贪心算法
    五大常用算法之二:动态规划算法
    SSH 只能用于远程 Linux 主机?那说明你见识太小了!
    通过Heketi管理GlusterFS为K8S集群提供持久化存储
    php大文件(视频)分片上传
    php大文件(视频)上传讨论
    php大文件(视频)上传分享
    php大文件(视频)上传问题
    php大文件(视频)上传方法
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/3694545.html
Copyright © 2011-2022 走看看