试例代码
publicclass ListNestGridView extends BaseAdapter implements
OnItemClickListener {
publicstaticfinalintItemHeight = 48;// 每项的高度
publicstaticfinalintPaddingLeft = 36;// 每项的高度
privateintmyPaddingLeft = 0;
private MyGridView toolbarGrid;
private List<Tag> listTag;
// private String[] categoryTitles={"租房租凭","二手车/拼车","婚庆/婚介"};
private Context parentContext;
private LayoutInflater layoutInflater;
private List<Category> listcategory;
public ListNestGridView(Context context, List<Category> listcategory)
{
parentContext=context;
this.listcategory=listcategory;
}
@Override
publicvoid onItemClick(AdapterView<?> parent, View view, int position,
long id)
{
Toast.makeText(parentContext, "当前选中的是:" + position, Toast.LENGTH_SHORT)
.show();
}
private TextView categroyTit;
private GridView gridview;
privateintcurent=0;
@Override
publicint getCount() {
// TODO Auto-generated method stub
Log.i("listcategorysize", listcategory.size()+"====");
returnlistcategory.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
returnlistcategory.get(position);
}
@Override
publiclong getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.i("tagList", "=7777=");
Category category=(Category) getItem(position);
if(convertView!=null){
position++;
categroyTit.setText(category.getTitle());
/*Log.i("categoryTitles", categoryTitles[position]+"===");*/
Log.i("current", position+"===");
Log.i("tagList333", "=55==");
Log.i("listcategorytags", category.getTags().size()+"==");
gridview.setAdapter(new GridViewAdapter(parentContext, category.getTags()));
gridview.setOnItemClickListener(this);
}else{
convertView=layoutInflater.from(parentContext).inflate(R.layout.gridview, null);
categroyTit=(TextView) convertView.findViewById(R.id.gridview_category_title);
gridview=(GridView)convertView.findViewById(R.id.GridView_toolbar);
Log.i("tagList", "==44= "+category.getTitle());
categroyTit.setText(category.getTitle());
/* Log.i("categoryTitles", categoryTitles[position]+"===");*/
Log.i("current", position+"===");
Log.i("tagList333", "=55==");
Log.i("listcategorytags", category.getTags().size()+"==");
gridview.setAdapter(new GridViewAdapter(parentContext, category.getTags()));
gridview.setOnItemClickListener(this);
}
Log.i("tagList", "==44= really comeback==");
return convertView;
}
private TextView tv;
class GridViewAdapter extends BaseAdapter {
private List<Tag> tags;
private Context context;
public GridViewAdapter(Context context,List<Tag> tag){
this.tags=tag;
this.context=context;
}
@Override
publicint getCount() {
// TODO Auto-generated method stub
Log.i("tags", tags.size()+"===");
returntags.size();
}
@Override
public Tag getItem(int position) {
// TODO Auto-generated method stub
returntags.get(position);
}
@Override
publiclong getItemId(int position) {
// TODO Auto-generated method stub
returntags.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView=layoutInflater.from(context).inflate(R.layout.gridview_item, null);
tv=(TextView) convertView.findViewById(R.id.item_text);
Tag tag=getItem(position);
Log.i("tv_name",tag.getName() );
tv.setText(tag.getName());
Log.i("tv_name","comeback assignment complete" );
return convertView;
}
}
}
对于listview中嵌套的对象添加item点击事件需要将外面的那个类继承 onitemListener这个接口
在外边的适配器中实现监听方法在这样做的同时会遇到一个问题就是listAdapter本身不是activity 它没有上下文对象所以listAdapter跟activity在在同一个.class文件中这样context可以用activity中的监听也可以做到同在一个activity不会出现ui更新等其他问题
它的实现远离跟单个适配器是一样的
很多问题都是出在传递数据这方面 所以只要把数据部分整理好传过来实现是没有问题的
值得一提的是通过log文件可以看到 return contentview 他是根据每次匹配得到一个view它就返回一次 但父类的视图只一次 所以不必担心
在显示gridview中的内容还是会出现很多问题 比如只能显示很少的一部分 滑动的时候对同一个item对象内容会总是在变换
1 显示的长度问题因为listview gridview都为继承了scrollview 都继承了滑动属性,当两个默认出现两个滑动控件在滑动时里面哪个是默认不响应 但有具有所以应该显示的屏蔽掉。一般的处理方式是将gridview 控件自己重写 重写主要就是重写publicvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>
MeasureSpec.AT_MOST);
expandSpec=expandSpec+15;
super.onMeasure(widthMeasureSpec, expandSpec);
}
将gridview中的高度设到文本高度这样就可以完整显示了
2 文字变化
主要用到的是 建一个内部类 将adapter中要显示的控件添加到这个类中 在getview中new这个类 将布局文件中得到的控件赋给新类的成员函数 再将contentview。setTag(新类)
将值赋给类的成员 ,这样子再显示的时候就不会变了
试例代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
holder=new GridHolder();
convertView=layoutInflater.from(context).inflate(R.layout.gridview_item, null);
holder.txt_name=(TextView) convertView.findViewById(R.id.item_text);
Tag tag=getItem(position);
convertView.setTag(holder);//将holder 添加到动态生成的View里面
holder.txt_name.setText(tag.getName());
return convertView;
}
privateclass GridHolder{
TextView txt_name;
}