ExpandableListView初步使用

大家好,我是刚学Android不久的小菜鸟,虽然觉得技术不行,但是我觉得还是想写一些东西,能和一起还在努力的人分享一下,如果觉得我写的不好,或者代码有不对的地方,还请各路大神多多指导。

好了,开始写正文。

还是先看layout布局中的代码

<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:orientation="vertical"
     >
	
    <ExpandableListView 
        android:id="@+id/expandable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawSelectorOnTop="false">
        <!-- drawSelectorOnTop属性用于背景颜色不会覆盖内容 -->
    </ExpandableListView>
    


</LinearLayout>
当然还有一些其他的基本属性,我这里就不写了,大家百度一下就好了。

我的项目是放在fragment中,如果有的同学是写在activity中的话有些细节稍微注意一下。

public class MyMusicFragment extends Fragment {
	private List<String> groupData;
	private List<List<Children>>childrenData;
	private MyMusicExpandableListViewAdapter adapter;
	private ExpandableListView expand;
	private View view;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		view=inflater.inflate(R.layout.fragment_mymusic, null);
		initView();//初始化控件方法
		setGroupData();//获取ExpandableListView中父控件的数据
		setChildrenData();//获取ExpandableListView中子控件的数据
		setAdapter();//设置适配器控件
		return view;
	}

	private void setChildrenData() {
		// TODO Auto-generated method stub
		childrenData = new ArrayList<List<Children>>();
		List<Children> childItem =null;
		if(childrenData.size()==0){
			childItem=new ArrayList<Children>();
			Children children=new Children(R.drawable.ic_stub, "我喜欢的音乐","0");
			childItem.add(children);
			
		}else{
			childItem =new ArrayList<Children>();
			
		}
		childrenData.add(childItem);
	}

	private void setGroupData() {
		// TODO Auto-generated method stub
		groupData = new ArrayList<String>();
		groupData.add("我创建的歌单");
		groupData.add("我收藏的歌单");
		
	}

	private void initView() {
		// TODO Auto-generated method stub
		expand=(ExpandableListView) view.findViewById(R.id.expandable);
	}


	private void setAdapter() {
		// TODO Auto-generated method stub
		adapter=new MyMusicExpandableListViewAdapter(groupData, childrenData);
		expand.setAdapter(adapter);
	}
	
}
其实仔细发现他和listview 的区别还是不大的,我在这里对控件和数据进行了初始化,然后将数据加载到适配器中显示出来。

然后就是适配器的代码:

import java.util.List;

import com.wonder.wonderplayer.MusicApp;
import com.wonder.wonderplayer.R;
import com.wonder.wonderplayer.entity.Children;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyMusicExpandableListViewAdapter extends BaseExpandableListAdapter {
	private List<String> groupTitle;
	private List<List<Children>> childrenList;
	public MyMusicExpandableListViewAdapter(List<String> groupTitle,List<List<Children>>childrenList){
		this.groupTitle=groupTitle;
		this.childrenList=childrenList;
	}
	
	//----------------------------------------Group--------------------------------------------
	
	//获取父控件的数量
	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return groupTitle.size();
	}

	//获取指定位置的父控件
	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return groupTitle.get(groupPosition);
	}

	//获取指定位置的父控件的Id
	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	
	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return false;
	}
	//获取父控件中要显示的控件
	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		
		GroupHolder groupHolder;
		if(convertView==null){
			groupHolder=new GroupHolder();
			convertView=View.inflate(MusicApp.getApp(), R.layout.expandableview_group_item, null);
			groupHolder.iv_group=(ImageView) convertView.findViewById(R.id.iv_group);
			groupHolder.tv_group=(TextView) convertView.findViewById(R.id.tv_group);
			convertView.setTag(groupHolder);
		}else{
			groupHolder=(GroupHolder) convertView.getTag();
		}
		if(isExpanded){
			groupHolder.iv_group.setImageResource(R.drawable.down);
		}else{
			groupHolder.iv_group.setImageResource(R.drawable.right);
		}
		groupHolder.tv_group.setText(groupTitle.get(groupPosition));
		
		return convertView;
	}

	
	
	class GroupHolder{
		ImageView iv_group;
		TextView tv_group;
	}
	
}
//-------------------------------------------------------------------------------

	//获取子控件的数量
	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		return childrenList.size();
	}
	
	//获取指定位置父控件中的指定位置的子控件
	@Override
	public Object getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childrenList.get(groupPosition).get(childPosition).getTitleName();
	}
	
	//获取指定位置父控件中的指定位置的子空间的Id
	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childPosition;
	}
	
	//获取子控件中要显示的控件
	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ChildHolder childHolder;
		if(convertView==null){
			childHolder=new ChildHolder();
			convertView=View.inflate(MusicApp.getApp(), R.layout.expandablelistview_child_item, null);
			childHolder.iv_child=(ImageView) convertView.findViewById(R.id.iv_child);
			childHolder.tv_childTitle=(TextView) convertView.findViewById(R.id.tv_child_title);
			childHolder.tv_songNum=(TextView) convertView.findViewById(R.id.tv_child_songNum);
			convertView.setTag(childHolder);
		}else{
			childHolder=(ChildHolder) convertView.getTag();
		}
		childHolder.iv_child.setImageResource(childrenList.get(groupPosition).get(childPosition).getIamgeId());
		childHolder.tv_childTitle.setText(childrenList.get(groupPosition).get(childPosition).getTitleName());
		childHolder.tv_songNum.setText(childrenList.get(groupPosition).get(childPosition).getSongNum());
		
		
		return convertView;
	}
	
	//子项是否含有点击事件,如果有,返回值设置为true
	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return true;
	}

	
	class ChildHolder{
		ImageView iv_child;
		TextView tv_childTitle;
		TextView tv_songNum;
	}
之前看了很多大神写的代码,在getChildrenCount方法中返回值是childrenList.get(groupPostion).size()。刚开始我也是这么写的,后来在我的项目中就出现了一个小bug,每次点击打开子项时就崩溃了,后来我就试着改成了childrenList.size(),如果有和我出现一样的问题的童鞋你们可以尝试一下。我对这个控件进行了自定义,我把自定义部分也贴出来,大家就随意看一下吧。

group:

<?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:layout_marginLeft="10dp"
        android:id="@+id/iv_group"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:src="@drawable/right"/>
    <TextView 
        android:id="@+id/tv_group"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:textSize="18sp"
        android:layout_marginLeft="10dp"
        android:textColor="#666666"
        android:text="我创建的歌单(0)"/>
    

</LinearLayout>

child:

<?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/iv_child"
        android:layout_width="80dp" 
        android:layout_height="80dp"
        android:src="@drawable/ic_stub"
        android:layout_marginLeft="10dp"
        />
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="vertical"
        android:layout_marginLeft="10dp"
        android:gravity="center_vertical">
    <TextView 
        android:id="@+id/tv_child_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我收藏的歌曲"/>
    <TextView 
        android:id="@+id/tv_child_songNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="0首"/>
        
    </LinearLayout>
    

</LinearLayout>
还有一个children实体类:

public class Children {
	private int iamgeId;
	private String titleName;
	private String songNum;
	public Children(int iamgeId, String titleName, String songNum) {
		super();
		this.iamgeId = iamgeId;
		this.titleName = titleName;
		this.songNum = songNum;
	}
	public Children() {
		super();
	}
	public int getIamgeId() {
		return iamgeId;
	}
	public void setIamgeId(int iamgeId) {
		this.iamgeId = iamgeId;
	}
	public String getTitleName() {
		return titleName;
	}
	public void setTitleName(String titleName) {
		this.titleName = titleName;
	}
	public String getSongNum() {
		return songNum;
	}
	public void setSongNum(String songNum) {
		this.songNum = songNum;
	}
	
}
 排版有点混乱,大家就将就着点看好了=3=,本来挺想把效果图放上来的,但是试了很久都贴不上来,然后我放弃了,希望能对大家有点帮助,如果有不对的地方请大神们留言指教










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值