ExpandableListView可折叠列表

可折叠列表最常见的例子就是qq联系人列表。其实他跟listView的区别也不大,就是item换成了组和子列表,一个组对应一个子列表。

直接贴代码

item_group

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/group_text"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="这是组"
        android:textSize="24sp"/>

</LinearLayout>
item_child
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1fede0">

    <ImageView
        android:id="@+id/img"
        android:layout_width="50dp"
        android:layout_height="50dp"
        />
    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="这是子列表item"
        android:textSize="20sp"/>

</LinearLayout>

对应的数据类

public class GData {
    public String gtext;

    public GData(String gtext){
        this.gtext=gtext;
    }
}
public class IData {
    public int imgid;
    public String text;

    public IData(int imgid,String text){
        this.imgid=imgid;
        this.text=text;
    }
}
重写的Adapter类
public class MAdapter extends BaseExpandableListAdapter{

    private ArrayList<GData> gDatas;
    private ArrayList<ArrayList<IData>> items;
    private Context context;

    public MAdapter(ArrayList<GData> gDatas, ArrayList<ArrayList<IData>> items,
                    Context context){
        this.context=context;
        this.gDatas = gDatas;
        this.items=items;
    }

    @Override
    public int getGroupCount() {
        return gDatas.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return items.get(groupPosition).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return gDatas.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return items.get(groupPosition).get(childPosition);
    }

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

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

    //组和子元素是否持有稳定的ID。一般为false
    @Override
    public boolean hasStableIds() {
        return false;
    }

    //显示分组视图
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolderGroup viewHolderGroup;
        if(convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.item_group,parent,false);
            viewHolderGroup=new ViewHolderGroup();
            viewHolderGroup.group_text= (TextView) convertView.findViewById(R.id.group_text);
            convertView.setTag(viewHolderGroup);
        }
        else{
            viewHolderGroup= (ViewHolderGroup) convertView.getTag();
        }
        viewHolderGroup.group_text.setText(gDatas.get(groupPosition).gtext);
        return convertView;
    }

    //显示子列表item视图
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                             View convertView, ViewGroup parent) {
        ViewHolderItem viewHolderItem;
        if(convertView==null){
            convertView=LayoutInflater.from(context).inflate(R.layout.item_child,parent,false);
            viewHolderItem=new ViewHolderItem();
            viewHolderItem.img= (ImageView) convertView.findViewById(R.id.img);
            viewHolderItem.text= (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(viewHolderItem);
        }
        else {
            viewHolderItem= (ViewHolderItem) convertView.getTag();
        }
        viewHolderItem.img.setImageResource(items.get(groupPosition).get(childPosition).imgid);
        viewHolderItem.text.setText(items.get(groupPosition).get(childPosition).text);
        return convertView;
    }

    //设置子列表是否可选中
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    private static class ViewHolderGroup{
        private TextView group_text;
    }

    private static class ViewHolderItem{
        private ImageView img;
        private TextView text;
    }

}
主活动类
public class MainActivity extends AppCompatActivity{

    public ArrayList<GData> gDatas;
    public ArrayList<ArrayList<IData>> items;
    public ArrayList<IData> iDatas;
    public Context context;
    public ExpandableListView elist;
    public MAdapter mAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context=MainActivity.this;
        elist= (ExpandableListView) findViewById(R.id.expand);

        initdata();

        mAdapter=new MAdapter(gDatas,items,context);
        elist.setAdapter(mAdapter);

        elist.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                                        int childPosition, long id) {

                Toast.makeText(context,items.get(groupPosition).get(childPosition).text,
                        Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        elist.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

                Toast.makeText(context,gDatas.get(groupPosition).gtext,
                        Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

    public void initdata(){
        gDatas=new ArrayList<GData>();
        items=new ArrayList<ArrayList<IData>>();

        gDatas.add(new GData("A组"));
        gDatas.add(new GData("B组"));
        gDatas.add(new GData("C组"));

        iDatas=new ArrayList<IData>();
        iDatas.add(new IData(R.mipmap.ic_launcher,"A组1号"));
        iDatas.add(new IData(R.mipmap.ic_launcher,"A组2号"));
        items.add(iDatas);

        iDatas=new ArrayList<IData>();
        iDatas.add(new IData(R.mipmap.ic_launcher,"B组1号"));
        iDatas.add(new IData(R.mipmap.ic_launcher,"B组2号"));
        items.add(iDatas);

        iDatas=new ArrayList<IData>();
        iDatas.add(new IData(R.mipmap.ic_launcher,"C组1号"));
        iDatas.add(new IData(R.mipmap.ic_launcher,"C组2号"));
        items.add(iDatas);
    }
}
可以看到,跟listView的用法很相似。但是有点问题,组的点击事件和子列表的点击事件都返回了一个boolean类型的值,子列表那里返回false,true都可以,组那里返回true的话子列表就不会展开了。查了API都是说  True if the click was handled  感觉也没说明白。有哪位读者若是知道麻烦留言告知一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值