关闭

ExpandableListView的简单使用

标签: expandablelistviewandroid
129人阅读 评论(0) 收藏 举报
分类:

像其他展示类的控件一样,我们来写个步骤

一、在布局中添加控件标签

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >
   <ExpandableListView
        android:id="@+id/expand_List"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       ></ExpandableListView>
</RelativeLayout>

二、在代码中声明并实例化控件

三、建适配器并添加数据

四、最后适配,并添加点击事件

代码:

ExpandableListviewActivity.java
public class ExpandableListviewActivity extends Activity {
    private ExpandableListView expandableListView;
    private MyAdapter mAdapter;

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

    public void init() {
        //实例化
        expandableListView = (ExpandableListView) findViewById(R.id.expand_List);
        //一句话可以去掉前面的图标
        //expandableListView.setGroupIndicator(null);
        //适配
        mAdapter = new MyAdapter(this);
        expandableListView.setAdapter(mAdapter);
        //加上如下for循环后,加载程序进来后所有列表项全部展开
//        for(int i = 0; i < mAdapter.getGroupCount(); i++){
//            expandableListView.expandGroup(i);
//        }
        //点击事件
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
 @Override
 public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
   Toast.makeText(ExpandableListviewActivity.this, groupPosition + "-" + childPosition, Toast.LENGTH_SHORT).show();
  return false;
            }
        });
    }

适配器:
public class MyAdapter extends BaseExpandableListAdapter {

    private Context context;
    //一级item栏图片 和标题
    private int[] logos = new int[]{R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher,};
    private String[] titles = new String[]{"任务1", "任务2", "任务3", "任务4"};
    //二级展示
    private String[][] contents = new String[][]{
            {"Socket", "XMPP", "自学控件", "再自学"},
            {"TabLayout", "线程", "线程池", "EvenBus", "RxJava", "WebView"},
            {"单例模式", "工厂模式", "代理模式", "GreenDao", "蓝牙通讯"},
            {"GIT SVN", "项目打包", "编译与反编译", "扫一扫"},
    };

    public MyAdapter(Context context) {
        this.context = context;
    }

    /**
     * 获取组的个数
     * 返回值:  组的个数
     */
    @Override
    public int getGroupCount() {
        return titles.length;
    }

    /**
     * 获取指定组中的子元素个数
     *
     * @param groupPosition:组位置(决定返回哪个组的子元素个数)
     * @return:指定组的子元素个数
     */
    @Override
    public int getChildrenCount(int groupPosition) {
        return contents[groupPosition].length;
    }


    /**
     * 获取指定组中的数据
     *
     * @param groupPosition:组位置
     * @return:返回组中的数据,也就是该组中的子元素数据
     */
    @Override
    public Object getGroup(int groupPosition) {
        return titles[groupPosition];
    }

    /**
     * 获取指定组中的指定子元素数据。
     *
     * @param groupPosition:组的位置
     * @param childPosition:组中子元素的位置
     * @return:返回指定子元素数据
     */
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return contents[groupPosition][childPosition];
    }

    /**
     * 获取指定组的ID,这个组ID必须是唯一的
     *
     * @param groupPosition:组位置
     * @return:返回组相关ID
     */
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    /**
     * 获取指定组中的指定子元素ID
     *
     * @param groupPosition:
     * @param childPosition:
     * @return:返回具体组里某个元素的ID
     */
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }


    /**
     * 组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。
     *
     * @return:返回一个Boolean类型的值,如果为TRUE,意味着相同的ID永远引用相同的对象
     */
    @Override
    public boolean hasStableIds() {
        return true;
    }

    /**
     * 获取显示指定组的视图对象。这个方法仅返回关于组的视图对象,
     * 要想获取子元素的视图对象,就需要调用getChildView(int, int, boolean, View, ViewGroup)。
     *
     * @param groupPosition:组位置(决定返回哪个视图)
     * @param isExpanded:该组是展开状态还是伸缩状态
     * @param convertView:该组是展开状态还是伸缩状态   注意:在使用前你应该检查一下这个视图对象是否非空并且这个对象的类型是否合适。
     *                                    由此引伸出,如果该对象不能被转换并显示正确的数据,
     *                                    这个方法就会调用getGroupView(int, boolean, View, ViewGroup)来创建一个视图(View)对象。
     * @param parent:返回的视图对象始终依附于的视图组。
     * @return:返回指定组的视图对象
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolder1 viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.title_simple, null);
            viewHolder = new ViewHolder1();
           viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
            viewHolder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder1) convertView.getTag();
        }
        viewHolder.image.setImageResource(logos [groupPosition]);
        viewHolder.title.setText(titles[groupPosition]);
        return convertView;
    }

    /**
     * 获取一个视图对象,显示指定组中的指定子元素数据。
     *
     * @param groupPosition:组位置(该组内部含有子元素)
     * @param childPosition: 子元素位置(决定返回哪个视图)
     * @param isLastChild:子元素是否处于组中的最后一个
     * @param convertView:  重用已有的视图
     * @param parent:返回的视图(View)对象始终依附于的视图组。
     * @return: 指定位置上的子元素返回的视图对象
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.child_simple, null);
            viewHolder = new ViewHolder();
            viewHolder.conntent = (TextView) convertView.findViewById(R.id.content);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.conntent.setText(contents[groupPosition][childPosition]);

        return convertView;
    }

    public class ViewHolder {
        TextView conntent;

    }

    public class ViewHolder1 {
        TextView title;
        ImageView image;
    }

    /**
     * 是否选中指定位置上的子元素。
     *
     * @param groupPosition:组位置
     * @param childPosition:子元素位置
     * @return:是否选中子元素
     */
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}


子布局:(自己可丰富样式)
title_simple.xml
<?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:orientation="horizontal">

    <ImageView
        android:id="@+id/image"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginLeft="30dp"
        />
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:gravity="center"
        android:text="hello"
        android:layout_marginLeft="10dp" />
</LinearLayout>

child_simple.xml
<?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">

    <TextView
        android:id="@+id/content"
        android:layout_marginLeft="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

效果如图
很丑,只是个简单的Demo~~~

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15009次
    • 积分:343
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:1篇
    • 译文:0篇
    • 评论:6条
    最新评论