expandlistview嵌套gridview来实现功能
在项目中要实现下图所示的功能,第一眼就想到要用expandlistview来实现,而ChildView的样式和gridview很像,我们就会想到用expandlistview嵌套gridview来实现下面的功能。
功能如图:
在界面中设置:
private void initUI(View layout) {
View SquadFooterview = getActivity().getLayoutInflater().inflate(R.layout.item_lv__footerview,null);
mSquadExListview = (ExpandableListView) mLayout.findViewById(R.id.expandableListView);
mSquadExListview.addFooterView(SquadFooterview);
//设置组的显示图片为空
mSquadExListview.setGroupIndicator(null);}
设置ExpandableListView一直为展开状态:
mSquadExListview.setOnGroupClickListener(new GroupClickListener());
/**
* 这个方法是让ExpandableListView的组设置为展开状态
*/
private class GroupClickListener implements OnGroupClickListener {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return true;
}
}
添加适配器:在获取到后台数据时添加适配器:
mSquadExListview.setAdapter(new ExpandableAdapter(mGrouplist, mChridlist));
for (int i = 0; i < mGrouplist.size(); i++) {
mSquadExListview.expandGroup(i);
}
mSquadExListview.setOnGroupClickListener(new GroupClickListener());
ExpandableListView的适配器:
private class ExpandableAdapter extends BaseExpandableListAdapter {
List<String> mGrouplist = new ArrayList<String>();
List<List<TeamSquad>> mChridlist = new ArrayList<List<TeamSquad>>();
private GvTeamSquadAdapter mGvAdapter;
public ExpandableAdapter(List<String> Grouplist, List<List<TeamSquad>> Chridlist) {
mGrouplist.addAll(Grouplist);
mChridlist.addAll(Chridlist);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return mChridlist.get(groupPosition).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
/**
* 取得显示给定分组给定子位置的数据用的视图
*/
@Override
public View getChildView(final int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
ChildViewHolder childHolder = null;
//根据不同的类型,来选择不同的布局文件
int childType = getChildType(groupPosition, childPosition);
if (convertView == null) {
childHolder = new ChildViewHolder();
if (childType==TYPE_COACH) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.item_team_squad_coach,parent,false);
childHolder.TvPlayerNumber = (TextView) convertView.findViewById(R.id.tv_player_number);
childHolder.TvPlayerName = (TextView) convertView.findViewById(R.id.tv_player_name);
childHolder.IvPlayerHead = (ImageView) convertView.findViewById(R.id.iv_player_head);
}else{
convertView = getActivity().getLayoutInflater().inflate(R.layout.item_team_squad_player,parent,false);
//此处的gridview为不可滑动的GridViewNoScroll。GridViewNoScroll为自定义的gridview,下面有说明;
childHolder.gvPlayerposition = (GridViewNoScroll) convertView.findViewById(R.id.gv_team_squad_player);
设置gridview的适配器
mGvAdapter = new GvTeamSquadAdapter(getActivity(),mChridlist,groupPosition,
childPosition,childHolder.gvPlayerposition);
childHolder.gvPlayerposition.setAdapter(mGvAdapter);
}
convertView.setTag(childHolder);
} else {
childHolder = (ChildViewHolder) convertView.getTag();
}
if (childType==TYPE_COACH) {
TeamSquad teamSquad = mChridlist.get(groupPosition).get(childPosition);
if ("0".equals(teamSquad.number)) {
childHolder.TvPlayerNumber.setText("");
}else{
childHolder.TvPlayerNumber.setText(teamSquad.number);
}
childHolder.TvPlayerName.setText(teamSquad.userName);
// 下载图片
imageLoader.displayImage(teamSquad.imageUrl, childHolder.IvPlayerHead, options);
}else{
//这边必须根据 childHolder.gvPlayerposition得到它对应的adapter,不然会造成滑动ExpandableListView时数据的跳变。
GvTeamSquadAdapter GvAdapter = (GvTeamSquadAdapter) childHolder.gvPlayerposition.getAdapter();
//更新gridview中adapter的groupPosition和childPosition来更新gridview
GvAdapter.setData(groupPosition,childPosition);
//刷新gridview的适配器
GvAdapter.notifyDataSetChanged();
}
return convertView;
}
//设置groupPosition=0时加载教练的布局,其余的加载球员的布局文件
@Override
public int getChildType(int groupPosition, int childPosition) {
if (groupPosition==0) {
return TYPE_COACH;
}else{
return TYPE_PLAYER;
}
}
//设置两种不同的ChildType类型,一种为教练的布局文件,一种为对员的布局文件
@Override
public int getChildTypeCount() {
return 2;
}
//这边一定要设置为1,因为Childview中只添加一个gridview,所以子布局中的个数为1个gridview的量
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return mGrouplist.get(groupPosition);
}
@Override
public int getGroupCount() {
return mGrouplist.size();
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
/**
* 取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象, 要想获取子元素的视图对象
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
GroupViewHolder groupHolder = null;
if (convertView == null) {
groupHolder = new GroupViewHolder();
convertView = getActivity().getLayoutInflater().inflate(
R.layout.item_team_expandablelv_group, null);
groupHolder.tvPlayerPosition = (TextView) convertView
.findViewById(R.id.tv_schedule_match_date);
convertView.setTag(groupHolder);
} else {
groupHolder = (GroupViewHolder) convertView.getTag();
}
groupHolder.tvPlayerPosition.setText(mGrouplist.get(groupPosition));
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
private class GroupViewHolder {
TextView tvPlayerPosition;
}
private class ChildViewHolder {
TextView TvPlayerNumber;
TextView TvPlayerName;
ImageView IvPlayerHead;
GridViewNoScroll gvPlayerposition;
}
自定义的GridViewNoScroll:
public class GridViewNoScroll extends GridView {
public GridViewNoScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}
GridViewNoScroll的适配器GvTeamSquadAdapter:
public class GvTeamSquadAdapter extends BaseAdapter implements OnClickListener{
protected ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageOptions options = ImageTools.getImageLoaderOptions(R.drawable.icon_user_default);
private List<List<TeamSquad>> mChridlist = new ArrayList<List<TeamSquad>>();
private List<TeamSquad> mlist = new ArrayList<TeamSquad>();
private int mGroupPosition;
private int mChildPosition;
private FragmentActivity mActivity;
private GridViewNoScroll mGvPlayerposition;
/**
* @param activity
* @param mGrouplist
* @param mChridlist
* @param groupPosition
* @param childPosition
* @param gvPlayerposition
*/
public GvTeamSquadAdapter(FragmentActivity activity,List<List<TeamSquad>> chridlist,
int groupPosition, int childPosition, GridViewNoScroll gvPlayerposition) {
mChridlist.clear();
mActivity = activity;
mChridlist.addAll(chridlist);
mGroupPosition = groupPosition;
mChildPosition = childPosition;
mGvPlayerposition = gvPlayerposition;
}
/**
* @param activity
* @param list
* @param groupPosition
* @param childPosition
*/
public GvTeamSquadAdapter(FragmentActivity activity, List<TeamSquad> list, int groupPosition,
int childPosition) {
mlist.clear();
mActivity = activity;
mlist.addAll(list);
mGroupPosition = groupPosition;
mChildPosition = childPosition;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mActivity.getLayoutInflater().inflate(R.layout.item_team_squad_coach,
parent,false);
holder = new ViewHolder();
holder.TvPlayerNumber = (TextView) convertView.findViewById(R.id.tv_player_number);
holder.TvPlayerName = (TextView) convertView.findViewById(R.id.tv_player_name);
holder.IvPlayerHead = (ImageView) convertView.findViewById(R.id.iv_player_head);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
TeamSquad teamSquad = mChridlist.get(mGroupPosition).get(position);
if ("0".equals(teamSquad.number)) {
holder.TvPlayerNumber.setText("");
}else{
holder.TvPlayerNumber.setText(teamSquad.number);
}
holder.TvPlayerName.setText(teamSquad.userName);
// 下载图片
imageLoader.displayImage(teamSquad.imageUrl, holder.IvPlayerHead, options);
mGvPlayerposition.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
TeamSquad squad = mChridlist.get(mGroupPosition).get(position);
PlayerMainActivity.actionStart(mActivity, squad.userId, squad.imageUrl,
squad.userName);
}
});
return convertView;
}
@Override
public int getCount() {
return mChridlist.get(mGroupPosition).size();
}
@Override
public Object getItem(int position) {
return mChridlist.get(mGroupPosition).get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView TvPlayerNumber;
TextView TvPlayerName;
ImageView IvPlayerHead;
}
@Override
public void onClick(View v) {
}
public void setData(int groupPosition, int childPosition) {
mGroupPosition=groupPosition;
mChildPosition=childPosition;
}
}
特别说明:
1.在嵌套的中,getChildrenCount一定要设置为1,这样才不会造成gridview中的数据重复。
2.更新GvAdapter 时,一定要先得到它所对应的adapter,不然会造成滑动ExpandableListView时数据的跳变。
通过:
GvTeamSquadAdapter GvAdapter = (GvTeamSquadAdapter) childHolder.gvPlayerposition.getAdapter();
来得到。 然后再根据adapter传递groupPosition和childPosition来更新gridview,
GvAdapter.setData(groupPosition,childPosition);
3.设置的子布局时,可以用getChildType来设置类型,getChildTypeCount来设置你子布局类型的种类。