ExpandableListView嵌套GridView

最终效果

这里写图片描述

这里写图片描述

使用:

xml中

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

主要过程代码

public class CategoryVideo_Fragment extends BaseFragment {
    private ExpandableListView elv_videocategory;
    private Adapter_VideoCategory adapter_videoCategory;
    private List<VideoCategory> videoCategories = new ArrayList<>();
    private List<String> groupList = new ArrayList<String>();//父层用到的名字集合
    private Map<String, List<SubCategory>> subMap = new HashMap<String, List<SubCategory>>();//展开项用到的集合

    @Override
    public View initView() {
        View view = View.inflate(mContext, R.layout.fragment_categoryvideo, null);

        elv_videocategory = (ExpandableListView) view.findViewById(R.id.elv_videocategory);
        adapter_videoCategory = new Adapter_VideoCategory(getActivity(), groupList, subMap);
        elv_videocategory.setGroupIndicator(null);//把ExpandableListView自带的箭头取消
        elv_videocategory.setAdapter(adapter_videoCategory);

        initData();
        return view;
    }

    private void initData() {
        //加载数据
         List<VideoCategory> list = response.body();
        if (list != null && list.size() > 0) {
            videoCategories.addAll(list);
               for (VideoCategory videoCategory : videoCategories) {
                 String groupName = videoCategory.getName();
                        groupList.add(groupName);//给group添加
                        subMap.put(groupName, videoCategory.getSubCategory());
                    }
                    adapter_videoCategory.notifyDataSetChanged();
                    //这一步是让ExpandableListView自动展开
                    for (int i = 0; i < groupList.size(); i++) {
                        elv_videocategory.expandGroup(i);
                    }
              }
         }
    }
    -----ExpandableListView的adapter

public class Adapter_VideoCategory extends BaseExpandableListAdapter {
    private Activity mActivity;
    private List<String> groupList = new ArrayList<>();
    private Map<String, List<SubCategory>> subMap = new HashMap<>();

    public Adapter_VideoCategory(Activity mActivity, List<String> groupList, Map<String, List<SubCategory>> subMap) {
        this.mActivity = mActivity;
        this.groupList = groupList;
        this.subMap = subMap;
    }
    //外层数
    @Override
    public int getGroupCount() {
        return groupList.size();
    }
    //这里如果嵌套gridview必须返回1 否则会数据重复
    @Override
    public int getChildrenCount(int groupPosition) {
        return 1;
    }

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        String key = groupList.get(groupPosition);
        return subMap.get(key).get(childPosition);
    }

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

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
    //设置groupview布局
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupViewHolder groupViewHolder;
        if (convertView == null) {
            groupViewHolder = new GroupViewHolder();
            convertView = View.inflate(mActivity, R.layout.category_header, null);
            groupViewHolder.tv_header = (TextView) convertView.findViewById(R.id.tv_header);
            convertView.setTag(groupViewHolder);
        }else{
            groupViewHolder = (GroupViewHolder) convertView.getTag();
        }
        groupViewHolder.tv_header.setText(groupList.get(groupPosition));

        return convertView;
    }
    //设置child布局
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildViewHolder childViewHolder;
        if (convertView == null) {
            childViewHolder = new ChildViewHolder();
            convertView = View.inflate(mActivity, R.layout.expadapter_child, null);
            //这里嵌套的gridview是继承后重写onMeasure后的gridView
            //其他步骤与使用gridview一样了
            childViewHolder.gv_child = (MyGridView) convertView.findViewById(R.id.gv_child);
            convertView.setTag(childViewHolder);
        }else{
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }
        String key = groupList.get(groupPosition);
        final List<SubCategory> list = subMap.get(key);
        Adapter_expChild adapter = new Adapter_expChild(mActivity,list);
        childViewHolder.gv_child.setAdapter(adapter);
        childViewHolder.gv_child.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(mActivity, VideoList_Activity.class);
                intent.putExtra("tag",list.get(position).getTag());
                intent.putExtra("name",list.get(position).getName());
                mActivity.startActivity(intent);
            }
        });
        return convertView;
    }

    //组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。
    返回一个Boolean类型的值,如果为TRUE,意味着相同的ID永远引用相同的对象。
    @Override
    public boolean hasStableIds() {
        return true;
    }
    //是否选中指定位置上的子元素。
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
    class ChildViewHolder{
        MyGridView gv_child;
    }
    class GroupViewHolder{
        TextView tv_header;
    }
}

--MyGridView 
public class MyGridView extends GridView {
    public MyGridView(android.content.Context context,
                      android.util.AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 设置不滚动
     */
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

设置不能点击合上

ExpandableListView.setOnGroupClickListener(new OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                // TODO Auto-generated method stub
                return true;
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值