最终效果
使用:
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;
}
});