expandlistview嵌套gridview来实现功能

                      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来设置你子布局类型的种类。











  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值