可张开的列表视图(分组)

可扩张列表ExpandableListView的使用:
/*
注意:不能为ExpandableListView控件设置setOnClickListener事件
 */
public class MainActivity extends Activity {
    private ExpandableListView expandableLv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        expandableLv = (ExpandableListView) findViewById(R.id.expandavleListView);
        final MyExpandableAdapter myAdapter = new MyExpandableAdapter();
        expandableLv.setAdapter(myAdapter);
        //expandableLv.setGroupIndicator(null);设置组的指示器为空
        
        //子项的点击事件
        expandableLv.setOnChildClickListener(new OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                //因为适配器里的getChild方法返回的数据为String,所以这里可以直接强转得到
                String str=(String) myAdapter.getChild(groupPosition, childPosition);
                System.out.println("子项的单机事件--"+str);
                return true;
            }
        });
        
       /**
        * 组的点击事件,该方法会比下面的展开与收缩事件先执行
        * 如果返回true,就不会展开列表,也不会执行下面的展开与收缩事件 ,注意这里的v,具体看下面的红色字体
        */
        expandableLv.setOnGroupClickListener(new OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                String str = (String) myAdapter.getGroup(groupPosition);
                System.out.println("点击了--"+str);
                return false;
            }
        });
        //组的展开监听事件
        expandableLv.setOnGroupExpandListener(new OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                String str = (String) myAdapter.getGroup(groupPosition);
                System.out.println("展开事件--点击了--"+str);
            }
        });
        //组的收缩监听事件
        expandableLv.setOnGroupCollapseListener(new OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {
                String str = (String) myAdapter.getGroup(groupPosition);
                System.out.println("收缩事件--点击了--"+str);
            }
        });
    }
    
    //可扩展ListView的适配器
    class MyExpandableAdapter extends BaseExpandableListAdapter{
        //组数据
        String [] group={"好友","同学"};
        int[] icon_group={android.R.drawable.btn_minus,android.R.drawable.btn_minus};
        //组员子数据
        String [][] children={{"张三","李四","王五"},{"赵六","周七","王八"}};
        int[][] icon_children={{android.R.drawable.ic_dialog_info,android.R.drawable.ic_popup_reminder,android.R.drawable.ic_dialog_map},
                          {android.R.drawable.ic_dialog_info,android.R.drawable.ic_popup_reminder,android.R.drawable.ic_dialog_map}};
        @Override
        public int getGroupCount() {
            return group.length;
        }
        /**
         * groupPosition组的子数据
         */
        @Override
        public int getChildrenCount(int groupPosition) {
            return children[groupPosition].length;
        }
        /**
         * 同下,方便于监听器获取点击的数据
         */
        @Override
        public Object getGroup(int groupPosition) {
            return group[groupPosition];
        }
        
        /**
         * @return 返回的数据就为子项的单击事件里getChild的数据
         * 所以监听事件里就可以通过适配器获取这个返回的数据
         */
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return children[groupPosition][childPosition];
        }
        
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
        /**
         * 是否相同的ID总是指的是同一个对象
         */
        @Override
        public boolean hasStableIds() {
            return false;
        }

        @Override //isExpanded代表这个组布局是否是展开的,并且没展开一个组,getGroupView会执行多次(多少组就多少次),所以如果想展开后改变组的显示效果就可以在此改变,具体看下面的红色字体
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            ViewHolder holder;
            if(convertView==null){
                //得到组布局
                convertView=View.inflate(MainActivity.this, R.layout.groud_layout, null);
                holder=new ViewHolder();
                holder.img=(ImageView) convertView.findViewById(R.id.icon);
                holder.textView=(TextView) convertView.findViewById(R.id.textview);
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder) convertView.getTag();
            }
            holder.img.setImageResource(icon_group[groupPosition]);
            holder.textView.setText(group[groupPosition]);
            return convertView;
        }

        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if(convertView==null){
                //得到子布局
                convertView=View.inflate(MainActivity.this, R.layout.child_layout, null);
                holder=new ViewHolder();
                holder.img=(ImageView) convertView.findViewById(R.id.icon);
                holder.textView=(TextView) convertView.findViewById(R.id.textview);
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder) convertView.getTag();
            }
            holder.img.setImageResource(icon_children[groupPosition][childPosition]);
            holder.textView.setText(children[groupPosition][childPosition]);
            return convertView;
        }
        /**
         * 控制child是否可以被点击  true可以
         */
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
        
    }
    class ViewHolder{
        private ImageView img;
        private TextView textView;
    }
}

activity_main.xml文件

<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=".MainActivity" >
   
    <ExpandableListView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff8dc"
        android:id="@+id/expandavleListView"/>

</RelativeLayout>

child_layout.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:paddingLeft="30dp"
    android:orientation="horizontal" >
  
      <ImageView 
          android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/icon"
        android:src="@drawable/ic_launcher"/>
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="not text"
        android:textColor="#0000ff"
        android:textSize="50sp"
        android:paddingLeft="5dp"
        android:id="@+id/textview"/>

</LinearLayout>

groud_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal" >
  
  <ImageView 
          android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/icon"
        android:src="@drawable/ic_launcher"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="not text"
        android:textColor="#ff00aa"
        android:textSize="60sp"
        android:paddingLeft="5dp"
        android:id="@+id/textview"/>

</LinearLayout>

效果图:

       

如果想要展开第二个的时候把第一个给关闭,可以这样:

// 组的展开监听事件
        expandableLv.setOnGroupExpandListener(new OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                String str = (String) myExpandableAdapter.getGroup(groupPosition);
                Log.i("tag", "展开事件--点击了---" + str);
                for (int i = 0; i < myExpandableAdapter.getGroupCount(); i++) {
                    if (groupPosition != i) {
                        expandableLv.collapseGroup(i);//关闭当前展开的其他项
                    }
                }
            }
        });

 expandableLv.setOnGroupClickListener为扩展的listView设置组的点击事件,监听方法中的V,有时候是点击的布局,但有时候并不是,如果直接通过该v,去找该组布局中的控件,会出现错乱的现象,那么当我们想去找点击的组里面的控件的时候,只能通过适配器里的getGroupView方法,在该方法中获取展开的item

@Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                // 得到组布局
                convertView = LayoutInflater.from(TestActivity.this).inflate(R.layout.concrete_service_item_layout, parent, false);
                holder = new ViewHolder();
                holder.concrete_service_lv_item_iv = (ImageView) convertView
                        .findViewById(R.id.concrete_service_lv_item_iv);
                holder.concrete_service_lv_item_tv = (TextView) convertView
                        .findViewById(R.id.concrete_service_lv_item_tv);
                holder.recyclerView = (RecyclerView) convertView.findViewById(R.id.concrete_service_recyclerview);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.concrete_service_lv_item_tv.setText(group[groupPosition]);
            holder.concrete_service_lv_item_tv.setClickable(true);//设置为可点击
             //根据enbled属性改变文本颜色
            ColorStateList colorStateList = getResources().getColorStateList(R.drawable.red_black_color_selector);
            holder.concrete_service_lv_item_tv.setTextColor(colorStateList);
            if(isExpanded){
                //获取展开的组,并找到改组的控件
                holder.concrete_service_lv_item_tv.setEnabled(false);
                holder.concrete_service_lv_item_iv.setImageResource(R.drawable.icon_service_pull_up);
                currentExpandRecyclerView = holder.recyclerView;//记录展开的组的控件,这里也就是关键了
            }else{
                //没有展开
                holder.concrete_service_lv_item_tv.setEnabled(true);
                holder.concrete_service_lv_item_iv.setImageResource(R.drawable.icon_service_pull);
            }
            //需要避免recyclerView数据显示的冲突,数据的保存与清空,groupPosition与Map来存
            //holder.recyclerView TODO recyclerView的数据
            return convertView;
        }

 

posted @ 2016-04-16 14:38  ts-android  阅读(269)  评论(0编辑  收藏  举报