android之ExpandableListView的使用
3053 点击·0 回帖
![]() | ![]() | |
![]() | 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> } } 通过以上代码我们就能实现想要的了有什么问题请留言,大家一起交流学习! | |
![]() | ![]() |