android中listView怎么复用多种布局
2016-07-12 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
adapter填充数据的时候,我们一般要实现以下方法:
1 public int getCount(){ }
2 public Object getItem(int position) {}
3 public long getItemId(int position) {}
4 public View getView(int position, View view, ViewGroup viewGroup){}
但是要实现复用多种布局的话我们还要实现下面2个方法
1 public int getItemViewType(int position) {}
返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写
类别的数值在(0,类别总数-1)之间
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
public static final int TYPE_MAX_COUNT = 3;
@Override
public int getItemViewType(int position) {
//复用tab结构
if (position == 1) {
return TYPE_TAB;
}
//复用一般的item结构
int size = CollectionUtils.size(feedDataList);
if (position >= 1 && size > 0 && position < (size + 2)) {
return TYPE_LIST_ITEM;
}
return TYPE_UNKNOW;
}
类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
2 public int getViewTypeCount() { } 返回复用布局的总数,这里是3
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
在adapter中的getView方法中,我们就可以这样来写:
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ItemViewHolder itemViewHolder;
TabViewHolder tabViewHolder;
int viewType= getItemViewType(position);
switch (viewType) {
case TYPE_TAB:
if(convertView == null ) {
tabViewHolder = new TabViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
tabViewHolder.findView(position,convertView,viewGroup);
}else{
//直接复用
tabViewHolder = (TabViewHolder)convertView.getTag();
}
//这里是处理业务逻辑的方法
tabViewHolder.setView(position);
return tabViewHolder.layout;//返回convertView
case TYPE_LIST_ITEM:
if (convertView == null) {
itemViewHolder = new ItemViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
itemViewHolder.findView(position, convertView, viewGroup);
} else {
//convertView不为空,直接复用
itemViewHolder = (ItemViewHolder) convertView.getTag();
}
//处理业务逻辑
itemViewHolder.setView((FeedComment)getItem(position));
return itemViewHolder.layout;//返回convertView
case TYPE_UNKNOW:
return null;
}
return null;
}
说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。
1 public int getCount(){ }
2 public Object getItem(int position) {}
3 public long getItemId(int position) {}
4 public View getView(int position, View view, ViewGroup viewGroup){}
但是要实现复用多种布局的话我们还要实现下面2个方法
1 public int getItemViewType(int position) {}
返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写
类别的数值在(0,类别总数-1)之间
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
public static final int TYPE_MAX_COUNT = 3;
@Override
public int getItemViewType(int position) {
//复用tab结构
if (position == 1) {
return TYPE_TAB;
}
//复用一般的item结构
int size = CollectionUtils.size(feedDataList);
if (position >= 1 && size > 0 && position < (size + 2)) {
return TYPE_LIST_ITEM;
}
return TYPE_UNKNOW;
}
类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是
public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
2 public int getViewTypeCount() { } 返回复用布局的总数,这里是3
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
在adapter中的getView方法中,我们就可以这样来写:
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ItemViewHolder itemViewHolder;
TabViewHolder tabViewHolder;
int viewType= getItemViewType(position);
switch (viewType) {
case TYPE_TAB:
if(convertView == null ) {
tabViewHolder = new TabViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
tabViewHolder.findView(position,convertView,viewGroup);
}else{
//直接复用
tabViewHolder = (TabViewHolder)convertView.getTag();
}
//这里是处理业务逻辑的方法
tabViewHolder.setView(position);
return tabViewHolder.layout;//返回convertView
case TYPE_LIST_ITEM:
if (convertView == null) {
itemViewHolder = new ItemViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
itemViewHolder.findView(position, convertView, viewGroup);
} else {
//convertView不为空,直接复用
itemViewHolder = (ItemViewHolder) convertView.getTag();
}
//处理业务逻辑
itemViewHolder.setView((FeedComment)getItem(position));
return itemViewHolder.layout;//返回convertView
case TYPE_UNKNOW:
return null;
}
return null;
}
说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询