扩展ListView的实现重点(ExpandableListView的强调点)

来源:互联网 发布:梦幻西游总是网络错误 编辑:程序博客网 时间:2024/05/24 05:01

从网上找了资料来学习扩展ListView,现将其中一个典型的例子分享,并加深自己的理解;

原文链接http://blog.csdn.net/zhouyuanjing/article/details/8254421

扩展ListView和普通的ListView一样,包括布局文件,数据适配器和MainActivity三部分,我们分别讲解

 

1.布局文件,传统的ListView只需要一个item布局文件,ExpandableListView需要两个item布局文件;

2.适配器基类变为BaseExpandableListAdapter,对应传入适配器的List集合变为List<List<T>>,外层是组,内层是真正的listview;

3.MainActivity需要继承的单击事件变为OnChildClickListener;

 

具体实现过程:

1.组布局文件

<?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="?android:attr/listPreferredItemHeight"    android:orientation="horizontal" >    <TextView        android:id="@+id/group_name"        android:layout_width="wrap_content"        android:layout_height="?android:attr/listPreferredItemHeight"        android:textAppearance="?android:attr/textAppearanceMedium"        android:layout_marginLeft="35dip"        android:gravity="center_vertical"        android:singleLine="true" />    <TextView        android:id="@+id/group_count"        android:layout_width="wrap_content"        android:layout_height="?android:attr/listPreferredItemHeight"        android:textAppearance="?android:attr/textAppearanceMedium"        android:layout_marginLeft="5dip"        android:gravity="center_vertical"        android:singleLine="true"/></LinearLayout>


 

2.子列表布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:minHeight="@dimen/min_Height"    android:descendantFocusability="blocksDescendants"    android:orientation="horizontal" >    <ImageButton        android:id="@+id/img"        android:layout_width="@dimen/image_width"        android:layout_height="@dimen/image_width"        android:layout_marginLeft="2dip"        android:layout_marginRight="10dip"        android:layout_gravity="center_vertical" />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:descendantFocusability="blocksDescendants"        android:orientation="vertical" >        <TextView            android:id="@+id/item_name"            android:layout_width="wrap_content"            android:layout_height="0.0dip"            android:gravity="center_vertical"            android:layout_weight="1" />        <TextView            android:id="@+id/item_detail"            android:layout_width="wrap_content"            android:layout_height="0.0dip"            android:gravity="center_vertical"            android:singleLine="true"            android:ellipsize="end"            android:layout_weight="1" />            </LinearLayout></LinearLayout>


 

3.适配器

package com.xyz.expande;import java.util.List;import android.app.AlertDialog;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;public class ExpandAdapter extends BaseExpandableListAdapter {    private Context mContext;    private LayoutInflater mInflater = null;    private String[]   mGroupStrings = null;    private List<List<Item>>   mData = null;    public ExpandAdapter(Context ctx, List<List<Item>> list) {        mContext = ctx;        mInflater = (LayoutInflater) mContext                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);        mGroupStrings = mContext.getResources().getStringArray(R.array.groups);        mData = list;    }    public void setData(List<List<Item>> list) {        mData = list;    }    @Override    public int getGroupCount() {        // TODO Auto-generated method stub        return mData.size();    }    @Override    public int getChildrenCount(int groupPosition) {        // TODO Auto-generated method stub        return mData.get(groupPosition).size();    }    @Override    public List<Item> getGroup(int groupPosition) {        // TODO Auto-generated method stub        return mData.get(groupPosition);    }    @Override    public Item getChild(int groupPosition, int childPosition) {        // TODO Auto-generated method stub        return mData.get(groupPosition).get(childPosition);    }    @Override    public long getGroupId(int groupPosition) {        // TODO Auto-generated method stub        return groupPosition;    }    @Override    public long getChildId(int groupPosition, int childPosition) {        // TODO Auto-generated method stub        return childPosition;    }    @Override    public boolean hasStableIds() {        // TODO Auto-generated method stub        return false;    }    @Override    public View getGroupView(int groupPosition, boolean isExpanded,            View convertView, ViewGroup parent) {        // TODO Auto-generated method stub        if (convertView == null) {            convertView = mInflater.inflate(R.layout.group_item_layout, null);        }        GroupViewHolder holder = new GroupViewHolder();        holder.mGroupName = (TextView) convertView                .findViewById(R.id.group_name);        holder.mGroupName.setText(mGroupStrings[groupPosition]);        holder.mGroupCount = (TextView) convertView                .findViewById(R.id.group_count);        holder.mGroupCount.setText("[" + mData.get(groupPosition).size() + "]");        return convertView;    }    @Override    public View getChildView(int groupPosition, int childPosition,            boolean isLastChild, View convertView, ViewGroup parent) {        // TODO Auto-generated method stub        if (convertView == null) {            convertView = mInflater.inflate(R.layout.child_item_layout, null);        }        ChildViewHolder holder = new ChildViewHolder();        holder.mIcon = (ImageView) convertView.findViewById(R.id.img);        holder.mIcon.setBackgroundResource(getChild(groupPosition,                childPosition).getImageId());        holder.mChildName = (TextView) convertView.findViewById(R.id.item_name);        holder.mChildName.setText(getChild(groupPosition, childPosition)                .getName());        holder.mDetail = (TextView) convertView.findViewById(R.id.item_detail);        holder.mDetail.setText(getChild(groupPosition, childPosition)                .getDetail());        return convertView;    }    @Override    public boolean isChildSelectable(int groupPosition, int childPosition) {        // TODO Auto-generated method stub              return true;    }    private class GroupViewHolder {        TextView mGroupName;        TextView mGroupCount;    }    private class ChildViewHolder {        ImageView mIcon;        TextView mChildName;        TextView mDetail;    }}


 

4.MainActivity

package com.xyz.expande;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.os.Bundle;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.ExpandableListView;import android.widget.ExpandableListView.OnChildClickListener;public class HomeActivity extends Activity implements OnChildClickListener {    private ExpandableListView mListView = null;    private ExpandAdapter mAdapter = null;    private List<List<Item>> mData = new ArrayList<List<Item>>();    private int[] mGroupArrays = new int[] {             R.array.tianlongbabu,            R.array.shediaoyingxiongzhuan,             R.array.shendiaoxialv };    private int[] mDetailIds = new int[] {             R.array.tianlongbabu_detail,            R.array.shediaoyingxiongzhuan_detail,             R.array.shendiaoxialv_detail };    private int[][] mImageIds = new int[][] {            { R.drawable.img_00,               R.drawable.img_01,               R.drawable.img_02 },            { R.drawable.img_10,               R.drawable.img_11,               R.drawable.img_12,              R.drawable.img_13,               R.drawable.img_14,               R.drawable.img_15,              R.drawable.img_16 },            { R.drawable.img_20,              R.drawable.img_21 } };    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initData();        mListView = new ExpandableListView(this);        mListView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,                LayoutParams.FILL_PARENT));        setContentView(mListView);                mListView.setGroupIndicator(getResources().getDrawable(R.drawable.expander_floder));//指示扩展ListView展开和关闭的符号        mAdapter = new ExpandAdapter(this, mData);        mListView.setAdapter(mAdapter);        mListView                .setDescendantFocusability(ExpandableListView.FOCUS_AFTER_DESCENDANTS);        mListView.setOnChildClickListener(this);    }    /*     * ChildView
    @Override    public boolean onChildClick(ExpandableListView parent, View v,            int groupPosition, int childPosition, long id) {        // TODO Auto-generated method stub        Item item = mAdapter.getChild(groupPosition, childPosition);        new AlertDialog.Builder(this)                .setTitle(item.getName())                .setMessage(item.getDetail())                .setIcon(android.R.drawable.ic_menu_more)                .setNegativeButton(android.R.string.cancel,                        new OnClickListener() {                            @Override                            public void onClick(DialogInterface dialog,                                    int which) {                                // TODO Auto-generated method stub                            }                        }).create().show();        return true;    }    private void initData() {        for (int i = 0; i < mGroupArrays.length; i++) {            List<Item> list = new ArrayList<Item>();            String[] childs = getStringArray(mGroupArrays[i]);            String[] details = getStringArray(mDetailIds[i]);            for (int j = 0; j < childs.length; j++) {                Item item = new Item(mImageIds[i][j], childs[j], details[j]);                list.add(item);            }            mData.add(list);        }    }    private String[] getStringArray(int resId) {        return getResources().getStringArray(resId);    }}

5.因子listview使用了样式,故定义了item来描述其成员

package com.xyz.expande;public class Item {        private int resId;    private String name;    private String detail;        public Item(int resId, String name, String detail) {        this.resId  = resId;        this.name   = name;        this.detail = detail;    }        public void setImageId(int resId) {        this.resId  = resId;    }        public int getImageId() {        return resId;    }        public void setName(String name) {        this.name   = name;    }        public String getName() {        return name;    }        public void setDetail(String detail) {        this.detail = detail;    }        public String getDetail() {        return detail;    }        public String toString() {        return "Item[" + resId + ", " + name + ", " + detail + "]";    }}


整个过程中需要注意的是

              1.适配器数据List<List<Item>>的构造;

              2.内外层ListView的样式的设计;

0 0