灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2544回复:0

android之ExpandableListView的使用

楼主#
更多 发布于:2012-09-06 14:03


ExpandableListView顾名思义既是可扩展的ListView,我们可用来实现菜单设置之类的功能。前些时间做项目用到了,现在给大家分享一下 ExpandableListView的实现方式。
先上效果图:



展开后:






布局文件如下:

[html] <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    >
    <ExpandableListView Android:id="@+id/newsList"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:cacheColorHint="@color/transparent"
        Android:drawSelectorOnTop="false"
        Android:groupIndicator="@null"
        >
    </ExpandableListView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<ExpandableListView Android:id="@+id/newsList"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:cacheColorHint="@color/transparent"
  Android:drawSelectorOnTop="false"
  Android:groupIndicator="@null"
  >
</ExpandableListView>
</LinearLayout>
ExpandableListView父栏目的布局如下:

[html] <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal"
    Android:layout_width="wrap_content"
    Android:layout_height="32dip"
    Android:background="@drawable/bg_group"
    Android:padding="5dip"
    >
    <TextView Android:id="@+id/group_text"
        Android:textSize="22dip"
        Android:textColor="@color/white"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>
    <ImageView Android:id="@+id/group_image"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:paddingLeft="10dip"
        Android:paddingTop="3dip"
    />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="horizontal"
Android:layout_width="wrap_content"
Android:layout_height="32dip"
Android:background="@drawable/bg_group"
Android:padding="5dip"
>
<TextView Android:id="@+id/group_text"
  Android:textSize="22dip"
  Android:textColor="@color/white"
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content"/>
<ImageView Android:id="@+id/group_image"
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content"
  Android:paddingLeft="10dip"
  Android:paddingTop="3dip"
/>
</LinearLayout>
子栏目的布局:

[html] <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@color/white"
    Android:padding="5dip"
    >
    <TextView Android:id="@+id/child"
        Android:layout_marginLeft="10dip"
        Android:textSize="22dip"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="horizontal"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:padding="5dip"
>
<TextView Android:id="@+id/child"
  Android:layout_marginLeft="10dip"
  Android:textSize="22dip"
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content"/>
</LinearLayout>下面看主要代码:

[java] package com.cloay.news;

import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.ExpandableListView;
import Android.widget.ExpandableListView.OnChildClickListener;

import com.cloay.news.bean.NewsListAdapter;
import com.cloay.news.service.MainService;

/**
* 实现栏目列表界面(使用ExpendListView实现)
* @author Cloay
* 2012-3-3
* 下午09:38:12
*/
public class HomeActivity extends NewsReaderActivity{
    private ExpandableListView newsList;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        MainService.allActivity.add(this);
        
        newsList = (ExpandableListView) findViewById(R.id.newsList);
        NewsListAdapter adapter = new NewsListAdapter(HomeActivity.this);
        newsList.setAdapter(adapter);
        newsList.setOnChildClickListener(new OnChildClickListener() {//<span style="color:#ff0000;">为item设置监听注意必须在adapter中 isChildSelectable()return true详见下面代码</span>  
            
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
//              System.out.println("groupPosition-->:" + groupPosition);  
//              System.out.println("childPosition-->:" + childPosition);  
                Intent intent = new Intent(HomeActivity.this, ContentActivity.class);
                intent.putExtra("groupPosition", groupPosition);
                intent.putExtra("childPosition", childPosition);
                HomeActivity.this.startActivity(intent);
                return true;
            }
        });
    }
}
package com.cloay.news;
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.ExpandableListView;
import Android.widget.ExpandableListView.OnChildClickListener;
import com.cloay.news.bean.NewsListAdapter;
import com.cloay.news.service.MainService;
/**
* 实现栏目列表界面(使用ExpendListView实现)
* @author Cloay
* 2012-3-3
* 下午09:38:12
*/
public class HomeActivity extends NewsReaderActivity{
private ExpandableListView newsList;
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.home);
  MainService.allActivity.add(this);
  
  newsList = (ExpandableListView) findViewById(R.id.newsList);
  NewsListAdapter adapter = new NewsListAdapter(HomeActivity.this);
  newsList.setAdapter(adapter);
  newsList.setOnChildClickListener(new OnChildClickListener() {//<span style="color:#ff0000;">为item设置监听注意必须在adapter中 isChildSelectable()return true详见下面代码</span>
  
   @Override
   public boolean onChildClick(ExpandableListView parent, View v,
     int groupPosition, int childPosition, long id) {
//    System.out.println("groupPosition-->:" + groupPosition);
//    System.out.println("childPosition-->:" + childPosition);
    Intent intent = new Intent(HomeActivity.this, ContentActivity.class);
    intent.putExtra("groupPosition", groupPosition);
    intent.putExtra("childPosition", childPosition);
    HomeActivity.this.startActivity(intent);
    return true;
   }
  });
}
}
为ExpandableListView提供数据的Adapter:

[java] package com.cloay.news.bean;

import java.util.ArrayList;
import java.util.List;

import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseExpandableListAdapter;
import Android.widget.ImageView;
import Android.widget.TextView;

import com.cloay.news.R;
import com.cloay.news.constants.Constants;

/**
* ExpandableListView添加数据
* @author Cloay
* 2012-3-4
* 下午08:10:29
*/
public class NewsListAdapter extends BaseExpandableListAdapter{
    @SuppressWarnings("rawtypes")
    private List<List> childList = new ArrayList<List>();
    private LayoutInflater  inflater;
    public NewsListAdapter(Context context) {
        super();
        //初始化数据  
        initData(context);
    }
    /**
     * 为group及child提供数据初始化
     * @param context
     */
    private void initData(Context context) {
        //设置父栏目标题  
        Constants.group.add(context.getResources().getString(R.string.sina_news));
        Constants.group.add(context.getResources().getString(R.string.sina_s));
        Constants.group.add(context.getResources().getString(R.string.sina_t));
        Constants.group.add(context.getResources().getString(R.string.sina_j));
        Constants.group.add(context.getResources().getString(R.string.sina_e));
        Constants.group.add(context.getResources().getString(R.string.sina_f));
        //每一个子栏目的标题  
        Constants.child1.add(context.getResources().getString(R.string.sina_china));
        Constants.child1.add(context.getResources().getString(R.string.sina_world));
        Constants.child2.add(context.getResources().getString(R.string.sina_s_all));
        Constants.child2.add(context.getResources().getString(R.string.sina_s_football));
        Constants.child2.add(context.getResources().getString(R.string.sina_s_nba));
        Constants.child3.add(context.getResources().getString(R.string.sina_t));
        Constants.child3.add(context.getResources().getString(R.string.sina_t_internet));
        Constants.child3.add(context.getResources().getString(R.string.sina_t_mobile));
        Constants.child4.add(context.getResources().getString(R.string.sina_j_all));
        Constants.child4.add(context.getResources().getString(R.string.sina_j_china));
        Constants.child4.add(context.getResources().getString(R.string.sina_j_world));
        Constants.child5.add(context.getResources().getString(R.string.sina_e_all));
        Constants.child6.add(context.getResources().getString(R.string.sina_f_w));
        Constants.child6.add(context.getResources().getString(R.string.sina_f_m));
        
        childList.add(Constants.child1);
        childList.add(Constants.child2);
        childList.add(Constants.child3);
        childList.add(Constants.child4);
        childList.add(Constants.child5);
        childList.add(Constants.child6);
        inflater = LayoutInflater.from(context);
    }
    public NewsListAdapter(String[] group){
        
    }
    @Override
    public int getGroupCount() {
        return Constants.group.size(); //父栏目大小  
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return childList.get(groupPosition).size();  //子栏目数量  
    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }

    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        if (convertView == null) {  
            convertView = inflater.inflate(  
                    R.layout.group, null);  
        }  
        ImageView image = (ImageView) convertView.findViewById(R.id.group_image);
        //设置展开时的图标  
        image.setImageResource(R.drawable.mm_submenu_down_normal);
        if(!isExpanded){
            image.setImageResource(R.drawable.mm_submenu_normal);
        }
        TextView textView = (TextView) convertView.findViewById(R.id.group_text);
        textView.setText(Constants.group.get(groupPosition));  
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {  
            convertView = inflater.inflate(  
                    R.layout.child, null);  
        }  
        TextView textView = (TextView) convertView.findViewById(R.id.child);
        textView.setText((childList.get(groupPosition)).get(childPosition).toString());  
        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;  //<span style="color:#ff0000;">返回true才能点击child</span>  
    }

    
}
package com.cloay.news.bean;
import java.util.ArrayList;
import java.util.List;
import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseExpandableListAdapter;
import Android.widget.ImageView;
import Android.widget.TextView;
import com.cloay.news.R;
import com.cloay.news.constants.Constants;
/**
* ExpandableListView添加数据
* @author Cloay
* 2012-3-4
* 下午08:10:29
*/
public class NewsListAdapter extends BaseExpandableListAdapter{
@SuppressWarnings("rawtypes")
private List<List> childList = new ArrayList<List>();
private LayoutInflater  inflater;
public NewsListAdapter(Context context) {
  super();
  //初始化数据
  initData(context);
}
/**
  * 为group及child提供数据初始化
  * @param context
  */
private void initData(Context context) {
  //设置父栏目标题
  Constants.group.add(context.getResources().getString(R.string.sina_news));
  Constants.group.add(context.getResources().getString(R.string.sina_s));
  Constants.group.add(context.getResources().getString(R.string.sina_t));
  Constants.group.add(context.getResources().getString(R.string.sina_j));
  Constants.group.add(context.getResources().getString(R.string.sina_e));
  Constants.group.add(context.getResources().getString(R.string.sina_f));
  //每一个子栏目的标题
  Constants.child1.add(context.getResources().getString(R.string.sina_china));
  Constants.child1.add(context.getResources().getString(R.string.sina_world));
  Constants.child2.add(context.getResources().getString(R.string.sina_s_all));
  Constants.child2.add(context.getResources().getString(R.string.sina_s_football));
  Constants.child2.add(context.getResources().getString(R.string.sina_s_nba));
  Constants.child3.add(context.getResources().getString(R.string.sina_t));
  Constants.child3.add(context.getResources().getString(R.string.sina_t_internet));
  Constants.child3.add(context.getResources().getString(R.string.sina_t_mobile));
  Constants.child4.add(context.getResources().getString(R.string.sina_j_all));
  Constants.child4.add(context.getResources().getString(R.string.sina_j_china));
  Constants.child4.add(context.getResources().getString(R.string.sina_j_world));
  Constants.child5.add(context.getResources().getString(R.string.sina_e_all));
  Constants.child6.add(context.getResources().getString(R.string.sina_f_w));
  Constants.child6.add(context.getResources().getString(R.string.sina_f_m));
  
  childList.add(Constants.child1);
  childList.add(Constants.child2);
  childList.add(Constants.child3);
  childList.add(Constants.child4);
  childList.add(Constants.child5);
  childList.add(Constants.child6);
  inflater = LayoutInflater.from(context);
}
public NewsListAdapter(String[] group){
  
}
@Override
public int getGroupCount() {
  return Constants.group.size(); //父栏目大小
}
@Override
public int getChildrenCount(int groupPosition) {
  return childList.get(groupPosition).size();  //子栏目数量
}
@Override
public Object getGroup(int groupPosition) {
  return null;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
  return null;
}
@Override
public long getGroupId(int groupPosition) {
  return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
  return 0;
}
@Override
public boolean hasStableIds() {
  return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
   View convertView, ViewGroup parent) {
  if (convertView == null) {
            convertView = inflater.inflate(
                    R.layout.group, null);
        }
  ImageView image = (ImageView) convertView.findViewById(R.id.group_image);
  //设置展开时的图标
  image.setImageResource(R.drawable.mm_submenu_down_normal);
  if(!isExpanded){
   image.setImageResource(R.drawable.mm_submenu_normal);
  }
        TextView textView = (TextView) convertView.findViewById(R.id.group_text);
        textView.setText(Constants.group.get(groupPosition));
        return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition,
   boolean isLastChild, View convertView, ViewGroup parent) {
  if (convertView == null) {
            convertView = inflater.inflate(
                    R.layout.child, null);
        }
        TextView textView = (TextView) convertView.findViewById(R.id.child);
        textView.setText((childList.get(groupPosition)).get(childPosition).toString());
        return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
  return true;  //<span style="color:#ff0000;">返回true才能点击child</span>
}

}
通过以上代码我们就能实现想要的了有什么问题请留言,大家一起交流学习!



喜欢0 评分0
游客

返回顶部