在Android开发的过程中,大家希望能实现可折叠列表视图

 ​


1.list.xml 源码

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

 xmlns:android="​​http://schemas.android.com/apk/res/android​​"

 android:orientation="vertical"

 android:background="@color/background_color"

 android:layout_width="fill_parent"

 android:layout_height="fill_parent"

 >

 <RelativeLayout

  android:id="@+id/expandable_relative_layout"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:gravity="center_horizontal"

  >

  <TextView

      android:id="@+id/list_title_text"

   android:textSize="22.0sp"

   android:textColor="@color/line_black"

   android:text="可扩展LISTVIEW学习"

   android:ellipsize="marquee"

   android:gravity="center_horizontal"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:singleLine="true"

   >

  </TextView>

 </RelativeLayout>

 <ExpandableListView

  android:id="@+id/expandable_list_view"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:drawSelectorOnTop="false"

  android:cacheColorHint="#00000000"

  android:dividerHeight="1.0dip"

  android:layout_below="@+id/expandable_relative_layout"

  >

 </ExpandableListView

>

</RelativeLayout>

注:去除GroupView自带折叠打开图片


添加android:groupIndicator="@null"

 <ExpandableListView

  android:groupIndicator="@null"  android:id="@+id/expandable_list_view"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:drawSelectorOnTop="false"

  android:cacheColorHint="#00000000"

  android:dividerHeight="1.0dip"

  android:layout_below="@+id/expandable_relative_layout"

  >

2.源代码

package com.android.expand;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.view.ContextMenu;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.MenuItem;

import android.view.View;

import android.view.ViewGroup;

import android.view.ContextMenu.ContextMenuInfo;

import android.widget.AbsListView;

import android.widget.BaseExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.ExpandableListView.ExpandableListContextMenuInfo;

public class ExpandableList1 extends Activity {

 public final static String tag = "ExpandableList1";

 public final static String NAME = "姓名:";

 public final static String PHONE = "电话:";

 public final static String SEX = "性别:";

 private ExpandableListView listView;

 private TextView mTitle;

 public List<String> group;

 public List<List<String>> child;

 public ExpandInfoAdapter adapter;

 @Override

 public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.list);

  findView();

  initListView();

  setListViewOnChildClickListener();

  // 注册长按选项弹出莱单

  registerForContextMenu(listView);

 }

 public void findView() {

  listView = (ExpandableListView) findViewById(R.id.expandable_list_view);

  mTitle = (TextView) this.findViewById(R.id.list_title_text);

 }

 public void initListView() {

  initialOther();

  addItemByValue("张三", "051782214", "男");

  addItemByValue("李四", "110", "男");

  addItemByValue("王二", "132", "女");

  addItemByValue("麻子", "13321234562", "女");

  adapter = new ExpandInfoAdapter(this);

  listView.setAdapter(adapter);

 }

 public void setListViewOnChildClickListener() {

  listView

    .setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

     public boolean onChildClick(ExpandableListView parent,

       View v, int groupPosition, int childPosition,

       long id) {

      Logs.i(tag, "groupPosition:" + groupPosition);

      Logs.i(tag, "childPosition:" + childPosition);

      Logs.i(tag, "id:" + id);

      return true;

     }

    });

 }

 public void initialOther() {

  group = new ArrayList<String>();

  child = new ArrayList<List<String>>();

 }

 public void addItemByValue(String n, String c1, String c2) {

  group.add(n);

  List<String> item = new ArrayList<String>();

  item.add(NAME + n);

  item.add(PHONE + c1);

  item.add(SEX + c2);

  child.add(item);

 }

 public class ExpandInfoAdapter extends BaseExpandableListAdapter {

  LayoutInflater mInflater;

  Bitmap mIcon1;

  Activity activity;

  public ExpandInfoAdapter(Activity a) {

   activity = a;

   mInflater = LayoutInflater.from(activity);

   mIcon1 = BitmapFactory.decodeResource(activity.getResources(),

     R.drawable.icon48x48_1);

  }

  // ++++++++++++++++++++++++++++++++++++++++++++

  // child's stub

  @Override

  public Object getChild(int groupPosition, int childPosition) {

   return child.get(groupPosition).get(childPosition);

  }

  @Override

  public long getChildId(int groupPosition, int childPosition) {

   return childPosition;

  }

  @Override

  public int getChildrenCount(int groupPosition) {

   return child.get(groupPosition).size();

  }

  @Override

  public View getChildView(int groupPosition, int childPosition,

    boolean isLastChild, View convertView, ViewGroup parent) {

   // return

   // getChildViewStub(child.get(groupPosition).get(childPosition)

   // .toString());

   return getView(groupPosition, childPosition, convertView, parent);

  }

  public TextView getChildViewStub(String s) {

   // Layout parameters for the ExpandableListView

   AbsListView.LayoutParams lp = new AbsListView.LayoutParams(

     ViewGroup.LayoutParams.FILL_PARENT, 64);

   TextView text = new TextView(activity);

   text.setLayoutParams(lp);

   text.setTextSize(20);

   text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

   text.setPadding(36, 0, 0, 0);

   text.setText(s);

   return text;

  }

  public View getView(int groupPosition, int childPosition,

    View convertView, ViewGroup parent) {

   ViewHolder holder;

   if (convertView == null) {

    convertView = mInflater.inflate(R.layout.list_item_icon_text,

      null);

    holder = new ViewHolder();

    holder.text = (TextView) convertView.findViewById(R.id.text);

    holder.icon = (ImageView) convertView.findViewById(R.id.icon);

    convertView.setTag(holder);

   } else {

    holder = (ViewHolder) convertView.getTag();

   }

   String name = child.get(groupPosition).get(childPosition);

   holder.text.setText(name);

   holder.icon.setImageBitmap(mIcon1);

   return convertView;

  }

  // ++++++++++++++++++++++++++++++++++++++++++++

  // group's stub

  @Override

  public Object getGroup(int groupPosition) {

   return group.get(groupPosition);

  }

  @Override

  public int getGroupCount() {

   return group.size();

  }

  @Override

  public long getGroupId(int groupPosition) {

   return groupPosition;

  }

  @Override

  public View getGroupView(int groupPosition, boolean isExpanded,

    View convertView, ViewGroup parent) {

   return getGroupViewStub(getGroup(groupPosition).toString());

  }

  public TextView getGroupViewStub(String s) {

   // Layout parameters for the ExpandableListView

   AbsListView.LayoutParams lp = new AbsListView.LayoutParams(

     ViewGroup.LayoutParams.FILL_PARENT, 64);

   TextView text = new TextView(activity);

   text.setLayoutParams(lp);

   text.setTextSize(20);

   text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

   text.setPadding(36, 0, 0, 0);

   text.setText(s);

   return text;

  }

  // Indicate whether Group is Expanded or Collapsed

  public void onGroupExpanded(int groupPosition) {

  }

  public void onGroupCollapsed(int groupPosition) {

  }

  @Override

  public boolean isChildSelectable(int groupPosition, int childPosition) {

   return true;

  }

  @Override

  public boolean hasStableIds() {

   return false;

  }

 }

 static class ViewHolder {

  TextView text;

  ImageView icon;

 }

 @Override

 public void onCreateContextMenu(ContextMenu menu, View v,

   ContextMenuInfo menuInfo) {

  menu.setHeaderTitle("Sample menu");

  menu.add(0, 0, 0, "menu1 order0");

  menu.add(0, 0, 1, "menu2 order1");

  menu.add(0, 1, 1, "menu3 item1");

  menu.add(1, 1, 1, "menu4 group1");

 }

 @Override

 public boolean onContextItemSelected(MenuItem item) {

  Logs.i(tag, "GroupID" + item.getGroupId() + ", itemId :"

    + item.getItemId() + " order :" + item.getOrder());

  ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item

    .getMenuInfo();

  int type = ExpandableListView

    .getPackedPositionType(info.packedPosition);

  if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {

   String title = ((ViewHolder) info.targetView.getTag()).text

     .getText().toString();

   int groupPos = ExpandableListView

     .getPackedPositionGroup(info.packedPosition);

   int childPos = ExpandableListView

     .getPackedPositionChild(info.packedPosition);

   Toast.makeText(

     this,

     title + ": Child " + childPos + " clicked in group"

       + groupPos, Toast.LENGTH_SHORT).show();

   return true;

  } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {

   String titles = ((TextView) info.targetView).getText().toString();

   int groupPos = ExpandableListView

     .getPackedPositionGroup(info.packedPosition);

   Toast.makeText(this, titles + ": Group " + groupPos + " clicked",

     Toast.LENGTH_SHORT).show();

   return true;

  }

  return false;

 }

}

注:控制点击groupview不展开childView方法

expandListView
    .setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
     @Override
     public boolean onGroupClick(ExpandableListView parent,
       View v, int groupPosition, long childPosition) {

      Toast.makeText(
        EmailExpandListActivity.this,
        "[Group Click]:" + groupPosition + " isEmpty :"
          + child.get(groupPosition).isEmpty(),
        Toast.LENGTH_SHORT).show();

      
      if (groupPosition == 0) { 

          return true;
      } else if (child.get(groupPosition).isEmpty()) {// isEmpty没有

         return true;
      } else {
       return false;
      }
     }
    });