首先gridview中先确定有两行,每行三列,放第五个数据之后动态给list添加一个“更多分类”的按钮,点击“更多分类之后”展开显示全部,并且在最后加上“收起”的按钮,在点击“收起”之后回到两行的状态并且出现“更多分类”按钮,隐藏“收起”按钮。并且“更多分类”、“收起”和被选中变色。上代码:
//加载数据
private void initView() {
list.add("苹果");
list.add("香蕉");
list.add("梨");
list.add("火龙果");
list.add("鲜橙");
list.add("草莓");
list.add("樱桃");
list.add("菠萝");
list.add("哈密瓜");
list.add("葡萄");
list.add("榴莲");
gv=(GridView) findViewById(R.id.gv);
}
数据随便加的,用list是因为实际使用中大多用list得到数据。
private void getGridView() {
if(list.size()>6 ){ //>6即为两列 超过两列隐藏
list1 = new ArrayList<String>();
for(int i=0;i<5;i++){
list1.add(list.get(i));
}
list1.add("更多分类∨");
gvadapter=new GvFenLeiAdapter(list1,this);
gv.setAdapter(gvadapter);
}else {
gvadapter=new GvFenLeiAdapter(list,this);
gv.setAdapter(gvadapter);
}
gv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
gvadapter.setSelectItem(position);
if(list1.get(position).contains("更多分类")){ //
gvadapter.setSelectItem(-1);
list1.clear();
list1.addAll(list);
list1.add("收起∧");
gvadapter.notifyDataSetChanged();
}else if (list1.get(position).contains("收起")) {
gvadapter.setSelectItem(-1);
list1.clear();
for(int i=0;i<5;i++){
list1.add(list.get(i));
}
list1.add("更多分类∨");
gvadapter.notifyDataSetChanged();
}else {
gvadapter.notifyDataSetChanged();
}
}
});
在这里进行了动态加减按钮,最后是adapter代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView =LayoutInflater.from(context).inflate(R.layout.grid_view_item, null);
TextView tv = (TextView) convertView.findViewById(R.id.tv);
tv.setText(list.get(position));
if(list.get(position).contains("更多") || list.get(position).contains("收起")){
tv.setTextColor(context.getResources().getColor(R.color.title_bar_title));
}else if (position == selectItem) {
tv.setTextColor(context.getResources().getColor(R.color.title_bar_title));
} else {
tv.setBackgroundColor(context.getResources().getColor(R.color.click));
tv.setTextColor(context.getResources().getColor(R.color.shouyetext1_color));
}
return convertView;
}
public void setSelectItem(int position) {
selectItem=position;
}
东西写得可能有点繁琐,也有点小缺陷,请多多指教。最后效果是这样的:

源码