ExpandableListView的简单实现

模仿的QQ好友列表的形式,效果如下 ,数据是写死的数组

数据是写死的数组:

分组名称

好友名

下面上代码:

activity::::::::::::::::::::::::::::::::::::::::::::::::::::::;

package com.activity;

import com.example.expandablelistview.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;

public class BuddyActivity extends Activity {
    ExpandableListView mExpandableListView;
    // 群组名称
    private String[] group = new String[] { "在线好友", "我的好友", "我的同事" };
    // 好友名称
    private String[][] buddy = new String[][] { { "甘于翔", "张正遥", "韩敏" },
            { "白慧", "李欢", "蒋磊" }, { "胡鹏", "胡文杰", "尹浩" } };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_expandablelistview);
        initView();
    }

    private void initView() {
        mExpandableListView = (ExpandableListView) findViewById(R.id.elv_view);
        ExpandableListAdapter adapter = new BuddyAdapter(this, group, buddy);
        mExpandableListView.setAdapter(adapter);

        // 分组展开
        mExpandableListView
                .setOnGroupExpandListener(new OnGroupExpandListener() {

                    @Override
                    public void onGroupExpand(int groupPosition) {

                    }
                });

        // 分组关闭
        mExpandableListView
                .setOnGroupCollapseListener(new OnGroupCollapseListener() {

                    @Override
                    public void onGroupCollapse(int groupPosition) {

                    }
                });

        // 子项单击
        mExpandableListView.setOnChildClickListener(new OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                Toast.makeText(
                        BuddyActivity.this,
                        group[groupPosition] + " : "
                                + buddy[groupPosition][childPosition],
                        Toast.LENGTH_SHORT).show();
                return false;
            }
        });

    }
}

适配器::::::::::::::::::::::::::::::::::::::::::::::

package com.activity;

import com.example.expandablelistview.R;

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 BuddyAdapter extends BaseExpandableListAdapter {

    private String[] group;
    private String[][] buddy;
    private Context context;
    LayoutInflater inflater;

    public BuddyAdapter(Context context, String[] group, String[][] buddy) {

        this.context = context;
        inflater = LayoutInflater.from(context);
        this.group = group;
        this.buddy = buddy;
    }

    @Override
    public int getGroupCount() {
        return group.length;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return buddy[groupPosition].length;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return group[groupPosition];
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return buddy[groupPosition][childPosition];
    }

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

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        convertView = inflater.inflate(R.layout.activity_group, null);
        TextView groupNameTextView = (TextView) convertView
                .findViewById(R.id.buddy_listview_group_name);
        groupNameTextView.setText(getGroup(groupPosition).toString());
        ImageView image = (ImageView) convertView
                .findViewById(R.id.buddy_listview_image);
        image.setImageResource(R.drawable.ic_launcher);
        // 更换展开分组图片
        if (!isExpanded) {
            image.setImageResource(R.drawable.ic_launcher);
        }
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        convertView = inflater.inflate(R.layout.activity_child_item, null);
        TextView nickTextView = (TextView) convertView
                .findViewById(R.id.buddy_listview_child_nick);
        nickTextView.setText(getChild(groupPosition, childPosition).toString());
        return convertView;
    }

    // 子选项时候可以选择
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}

以下是布局文件:

activity_child_item:::::::::::::::::::::::::::::::::::::::::::::::::::::

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dip"
    >
    <ImageView  
        android:id="@+id/buddy_listview_child_avatar"  
        android:layout_width="40dip"  
        android:layout_height="40dip"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
       android:layout_marginLeft="10dp"  
        android:src="@drawable/ic_launcher" />  
    <TextView  
        android:id="@+id/buddy_listview_child_nick"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentTop="true"  
        android:layout_toRightOf="@+id/buddy_listview_child_avatar"  
        android:text="昵称"  
        android:textSize="16sp" />  
    <TextView  
        android:id="@+id/buddy_listview_child_trends"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignLeft="@+id/buddy_listview_child_nick"  
       android:layout_alignParentBottom="true"  
        android:text="该好友暂时没有新动态"  
        android:textSize="12sp" />

</RelativeLayout>

activity_expandablelistView:::::::::::::::::::::::::::::::::::::::::::::::

<?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="match_parent"
    android:padding="16dp"
    >

    <ExpandableListView
        android:id="@+id/elv_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ExpandableListView>

</LinearLayout>

activity_group::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:id="@+id/rl_group"
    android:background="#219ad6"
     >

<ImageView  
        android:id="@+id/buddy_listview_image"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_centerVertical="true"  
        android:layout_marginLeft="10dp"  
        android:src="@drawable/ic_launcher"
        />  
    <TextView  
        android:id="@+id/buddy_listview_group_name"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerVertical="true"  
        android:layout_toRightOf="@+id/buddy_listview_image"  
        android:text="分组名称" />  
    <TextView  
        android:id="@+id/buddy_listview_group_num"  
        android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
        android:layout_alignParentRight="true"  
        android:layout_centerVertical="true"  
        android:layout_marginRight="10dp"  
        android:text="[10/10]"/>
 </RelativeLayout>

以上的这些代码基本上可以跑起来,成如图的效果,然后因为数据都是写死的没有 请求网络动态的获取,所以十分简单,

要从网络获取json然后用Gson解析 然后 转成自己需要的数组,然后适配 整个一套流程走下来要注意的地方有很多。。。。

ExpandableListView还有一些特需的属性:
1.设置ExpandableListView默认展开

先实例化 exListView

然后

   exListView.setAdapter(exlvAdapter);

   //遍历所有group,将所有项设置成默认展开

   int groupCount = exListView.getCount();

   for (int i=0; i<groupCount; i++) {

       exListView.expandGroup(i);

       };

2.去掉ExpandableListView默认的箭头:
用到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可,如下:

settingLists.setGroupIndicator(null); ~~~~~~~~~~~~~此处就是设置自定义的箭头图标的。置空则没有了。

也可以自定义(但是位置还是在那个地方不推荐)如下:

首先,自定义一个expandablelistviewselector.xml文件,具体内容如下:
Java代码

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">   

    <item android:state_expanded="true" android:drawable="@drawable/expandablelistviewindicatordown" />   

    <item android:drawable="@drawable/expandablelistviewindicator" />   

</selector>  

加一句代码如下:

settingLists.setGroupIndicator(this.getResources().getDrawable(R.drawable.expandablelistviewselector)); 

大功告成

3.将默认的箭头修改到右边显示:

1首先 ExpandableListView elistview;

         elistview.setGroupIndicator(null);//将控件默认的左边箭头去掉,

2在 自定义的继承自BaseExpandableListAdapter的adapter中有一个方法

/**
 * 父类view
 */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        Log.i("zhaoxiong","parent view");
            LinearLayout parentLayout=(LinearLayout) View.inflate(context, R.layout.wowocoupons_parent_item, null);
            TextView parentTextView=(TextView) parentLayout.findViewById(R.id.parentitem);
            parentTextView.setText(parentlist.get(groupPosition));
            ImageView parentImageViw=(ImageView) parentLayout.findViewById(R.id.arrow);

//判断isExpanded就可以控制是按下还是关闭,同时更换图片
            if(isExpanded){
                parentImageViw.setBackgroundResource(R.drawable.arrow_down);
            }else{
                parentImageViw.setBackgroundResource(R.drawable.arrow_up);
            }

        return parentLayout;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ExpandableListView可以实现QQ好友分组列表。首先需要创建一个ExpandableListView控件,并为其设置适配器。适配器需要继承BaseExpandableListAdapter,并实现以下方法: 1. getGroupCount():获取分组的数量。 2. getChildrenCount():获取某个分组下子项的数量。 3. getGroup():获取某个分组的数据。 4. getChild():获取某个分组下某个子项的数据。 5. getGroupId():获取某个分组的ID。 6. getChildId():获取某个分组下某个子项的ID。 7. hasStableIds():判断分组和子项的ID是否稳定。 8. getGroupView():获取分组的视图。 9. getChildView():获取子项的视图。 10. isChildSelectable():判断子项是否可选中。 在实现适配器的过程中,需要根据数据源的结构来设置分组和子项的数据。例如,可以使用一个List<List<String>>来存储分组和子项的数据,其中外层List表示分组,内层List表示子项。在getGroup()和getChild()方法中,需要根据groupPosition和childPosition来获取对应的数据。 最后,需要为ExpandableListView设置分组的展开和收起事件。可以通过设置OnGroupClickListener和OnChildClickListener来实现。在OnGroupClickListener中,需要根据groupPosition来判断当前分组是否已经展开,如果已经展开则返回false,否则返回true。在OnChildClickListener中,可以根据childPosition来获取对应的数据,并进行相应的操作。 通过以上步骤,就可以实现一个简单的QQ好友分组列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值