Android 可展开列表视图

一、案例操作 - 选择四大名著人物

1、创建安卓应用【SelectCharacter】

在这里插入图片描述

在这里插入图片描述

2、将图片素材拷贝到drawable目录

在这里插入图片描述

3、主布局资源文件activity_main.xml

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="@drawable/background" 
    tools:context="net.hw.select_character.MainActivity">

    <ExpandableListView
        android:id="@+id/elvBook"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:childDivider="#555555"
        android:childIndicator="@drawable/child" />
</LinearLayout>

4、创建组列表项模板文件group_list_item.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:background="#00b7ec"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="40dp"
        android:textColor="#ffffff"
        android:textSize="25sp" />
</LinearLayout>

5、创建子列表项模板文件child_list_item.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="vertical">

    <TextView
        android:id="@+id/tvCharacter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="60dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:textColor="#0000ff"
        android:textSize="22sp" />
</LinearLayout>

6、创建可扩展列表适配器BookAdapter

在这里插入图片描述

package net.alt.selectcharacter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;


public class BookAdapter extends BaseExpandableListAdapter {
    
    
    private Context context;
    private String[] groups;
    private String[][] children;

    public BookAdapter(Context context, String[] groups, String[][] children) {
    
    
        this.context = context;
        this.groups = groups;
        this.children = children;
    }

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

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

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
    
    
        return children[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;
    }

    /**
     * 获取组列表视图
     *
     * @param groupPosition
     * @param isExpanded
     * @param convertView
     * @param viewGroup
     * @return
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
    
    
        GroupViewHolder holder = null;
        if (convertView == null) {
    
    
            convertView = LayoutInflater.from(context).inflate(R.layout.group_list_item, null);
            holder = new GroupViewHolder();
            holder.tvTitle = convertView.findViewById(R.id.tvTitle);
            convertView.setTag(holder);
        } else {
    
    
            holder = (GroupViewHolder) convertView.getTag();
        }

        holder.tvTitle.setText(groups[groupPosition]);

        return convertView;
    }

    /**
     * 获取子列表视图
     *
     * @param groupPosition
     * @param childPosition
     * @param isExpanded
     * @param convertView
     * @param viewGroup
     * @return
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
    
    
        ChildViewHolder holder = null;
        if (convertView == null) {
    
    
            convertView = LayoutInflater.from(context).inflate(R.layout.child, null);
            holder = new ChildViewHolder();
            holder.tvCharacter = convertView.findViewById(R.id.tvCharacter);
            convertView.setTag(holder);
        } else {
    
    
            holder = (ChildViewHolder) convertView.getTag();
        }
        holder.tvCharacter.setText(children[groupPosition][childPosition]);

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
    
    
        return true;
    }

    /**
     * 子视图容器
     */
    private class ChildViewHolder {
    
    
        TextView tvCharacter;
    }

    /**
     * 组视图容器
     */
    private class GroupViewHolder {
    
    
        TextView tvTitle;
    }
}


7、主界面类MainActivity
在这里插入图片描述

package net.alt.selectcharacter;

import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import net.alt.selectcharacter.BookAdapter;

public class MainActivity extends AppCompatActivity {
    
    
    private String[] groups = {
    
    "西游记", "水浒传", "三国演义", "红楼梦"};
    private String[][] children = {
    
    
            {
    
    "唐三藏", "孙悟空", "猪八戒", "沙和尚", "如来", "观音菩萨"},
            {
    
    "宋江", "林冲", "李逵", "鲁智深", "杨志", "武松", "卢俊义"},
            {
    
    "曹操", "刘备", "孙权", "诸葛亮", "周瑜", "鲁肃", "陆逊", "赵云"},
            {
    
    "贾宝玉", "林黛玉", "薛宝钗", "王熙凤", "史湘云", "秦可卿", "贾探春"}
    };

    private ExpandableListView elvBook;
    private BookAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过资源标识获得控件实例
        elvBook = findViewById(R.id.elvBook);

        // 创建适配器
        adapter = new BookAdapter(this, groups, children);

        // 给列表控件设置适配器
        elvBook.setAdapter(adapter);

        // 给列表控件注册组列表展开监听器(非当前组收拢)
        elvBook.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    
    
            @Override
            public void onGroupExpand(int groupPosition) {
    
    
                for (int i = 0; i < groups.length; i++) {
    
    
                    if (i != groupPosition) {
    
    
                        elvBook.collapseGroup(i);
                    }
                }
            }
        });

        // 给列表控件注册组列表单击事件监听器
        elvBook.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    
    
            @Override
            public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long l) {
    
    
                Toast.makeText(MainActivity.this, "你单击了第[" + (groupPosition + 1) + "]组:" + groups[groupPosition], Toast.LENGTH_SHORT).show();
                // 事件可往后传播
                return false;
            }
        });

        // 给列表控件注册子列表单击事件监听器
        elvBook.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    
    
            @Override
            public boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long childId) {
    
    
                Toast.makeText(MainActivity.this, "你单击了第[" + (groupPosition + 1) + "]组第[" + (childPosition + 1) + "]项:" + children[groupPosition][childPosition], Toast.LENGTH_SHORT).show();
                // 禁止事件往后传播
                return true;
            }
        });
    }
}

8、启动应用,查看效果
请添加图片描述

猜你喜欢

转载自blog.csdn.net/m0_62786921/article/details/128360760
今日推荐