Android BaseExpandableListAdapter的用法解析

/**
 * Created by Administrator on 2018/10/19 0019.
 */

public class MyAdapter340 extends BaseExpandableListAdapter {
    Context context;
    List<Group> list;
    public MyAdapter340(Context context,List<Group> list){//构造函数,初始化MyAdapter340,设置入参数据
        this.context=context;
        this.list=list;
    }
    //expandablelistview可以理解为List里面嵌套List,即把List的item设置为一个List
    //我将第一个定义为一级List,嵌套的称谓二级List
    @Override
    public int getGroupCount() {//返回二级List个数,用于设置一级List的item个数,也就是二级List个数
        return list.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {//返回二级List的子项个数,用于设置二级List的item个数
        return list.get(groupPosition).getChilds().size();
    }

    @Override
    public Object getGroup(int groupPosition) {//获取一级List的子项数据
        return list.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {//获取指定一级List的item(二级List)的指定item
        return list.get(groupPosition).getChilds().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {//可扩展列表要求每个条目 (分组条目和子条目)具有一个可以唯一识别
        // 列表中子条目和分组条目的ID. 该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果 hasStableIds()
        // 为真,该函数返回的ID必须是固定不变的.
        return groupPosition;
    }

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        //groupPosition      决定返回哪个视图的组位置 .
        //isExpanded     该组是展开状态还是收起状态 .
        //convertView      如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.
        // 如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getGroupView(int, boolean,View, ViewGroup)创建的视图.
        //parent         该视图最终从属的父视图.
        if(convertView==null){
            //如果convertView视图对象为空,则将xml文件解析生成一个View并依据partent的类型setView的LayoutParams(布局参数),但不加入到partent里面
            convertView= LayoutInflater.from(context).inflate(R.layout.group_item340,parent,false);
        }
        //获取TextView组件
        TextView group_name_textView = (TextView) convertView.findViewById(R.id.group_name_textView340);
        //获取一级list返回视图的对应位置(groupPosition)的Group对象
        Group group = list.get(groupPosition);
        //设置一级List的显示文本
        group_name_textView.setText(group.getGroup_name());
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean b, View view, ViewGroup viewGroup) {
        if(view==null){
            //view,则将xml文件解析生成一个View并依据viewGroup的类型设置 View的LayoutParams(布局参数),但不加入到viewGroup里面
            view=LayoutInflater.from(context).inflate(R.layout.child_item340,viewGroup,false);
        }
        //获取ImageView组件
        ImageView child_photo_imageView = (ImageView) view.findViewById(R.id.child_photo_imageView340);
        //获取TextView组件
        TextView child_name_textView = (TextView) view.findViewById(R.id.child_name_textView340);
        //获取二级List返回视图的对应位置坐标的item
        Group group = list.get(groupPosition);
        //获取二级List返回的item的对应位置
        Child child = group.getChilds().get(childPosition);
        child_name_textView.setText(child.getChild_name());
        child_photo_imageView.setImageResource(child.getPhoto());
        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView 实现多级树状结构可以使用嵌套 RecyclerView 或者使用 ExpandableListView。 1. 嵌套 RecyclerView 首先,要实现多级树状结构,需要自定义 RecyclerView.Adapter,并在 Adapter 中使用嵌套 RecyclerView 的方式来实现。具体步骤如下: 1)在主 RecyclerView 的 item 布局中添加一个子 RecyclerView。 2)在主 RecyclerView 的 ViewHolder 中,获取子 RecyclerView 的引用,并设置子 RecyclerView 的 LayoutManager 和 Adapter。 3)在子 RecyclerView 的 Adapter 中,重写 onCreateViewHolder 和 onBindViewHolder 方法,并绑定子 RecyclerView 的 ViewHolder。 4)在子 RecyclerView 的 ViewHolder 中,设置 item 的布局和数据。 代码示例: ```java public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> { private List<Data> mDataList; public static class ViewHolder extends RecyclerView.ViewHolder { RecyclerView mSubRecyclerView; public ViewHolder(View itemView) { super(itemView); mSubRecyclerView = itemView.findViewById(R.id.sub_recycler_view); mSubRecyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext())); } public void setSubAdapter(SubAdapter adapter) { mSubRecyclerView.setAdapter(adapter); } } public MainAdapter(List<Data> dataList) { mDataList = dataList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Data data = mDataList.get(position); SubAdapter adapter = new SubAdapter(data.getSubDataList()); holder.setSubAdapter(adapter); } @Override public int getItemCount() { return mDataList.size(); } } public class SubAdapter extends RecyclerView.Adapter<SubAdapter.ViewHolder> { private List<Data> mDataList; public static class ViewHolder extends RecyclerView.ViewHolder { TextView mTextView; public ViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); } public void setData(Data data) { mTextView.setText(data.getName()); } } public SubAdapter(List<Data> dataList) { mDataList = dataList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sub, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Data data = mDataList.get(position); holder.setData(data); } @Override public int getItemCount() { return mDataList.size(); } } ``` 2. 使用 ExpandableListView 另一种实现多级树状结构的方式是使用 ExpandableListView。ExpandableListView 是 Android 原生提供的一个支持展开和收缩的列表控件,可以方便地实现多级树状结构。具体步骤如下: 1)在布局文件中添加 ExpandableListView。 2)创建 ExpandableListAdapter,并重写 getGroupCount、getChildrenCount、getGroupView 和 getChildView 等方法,用来设置父项和子项的布局和数据。 3)在 Activity 或 Fragment 中,设置 ExpandableListView 的适配器。 代码示例: ```java public class MyExpandableListAdapter extends BaseExpandableListAdapter { private List<String> mGroupData; private List<List<String>> mChildData; public MyExpandableListAdapter(List<String> groupData, List<List<String>> childData) { mGroupData = groupData; mChildData = childData; } @Override public int getGroupCount() { return mGroupData.size(); } @Override public int getChildrenCount(int groupPosition) { return mChildData.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return mGroupData.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return mChildData.get(groupPosition).get(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) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group, parent, false); } TextView textView = convertView.findViewById(R.id.text_view); textView.setText(mGroupData.get(groupPosition)); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_child, parent, false); } TextView textView = convertView.findViewById(R.id.text_view); textView.setText(mChildData.get(groupPosition).get(childPosition)); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } ``` 使用 ExpandableListView 的示例代码: ```java ExpandableListView listView = findViewById(R.id.expandable_list_view); List<String> groupData = new ArrayList<>(); List<List<String>> childData = new ArrayList<>(); // 添加数据 MyExpandableListAdapter adapter = new MyExpandableListAdapter(groupData, childData); listView.setAdapter(adapter); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值