android中listView怎么复用多种布局

android中listView怎么复用多种布局,第1张

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,这个时候类型转换错误就出现了。

主要是为了减少内存的消耗,如果不进行复用,那么创建一千个Item,就需要实例化1千个实例,会造成内存溢出。目前listview采用的策略是,只显示一屏幕的View,当View超过一屏幕,将其移除后放到最下面进行复用。

好处:减少内存占用,避免内存溢出。

坏处:CPU占用会稍微高点,因为会不断重复Iitem的溢出添加。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8155115.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存