前两篇博客中,讲了如何使用ListView并且复用了view对象,提高了ListView显示效率。
本篇博客讲解如何用ListView显示多种布局(以2种布局为例)。
效果图:
步骤一:先在上篇博客的基础上,在增加一个LabelHolder。
class LabelHolder{
TextView text;
}
步骤二:重写ListView适配器的另外两个方法。
方法一:
/**
* 有多少种布局类型
*/
@Override
public int getViewTypeCount() {
return 2;
}
方法二:
/**
* 获取某个位置是那种类型的布局
*/
@Override
public int getItemViewType(int position) {
if(position==0||position==11){
return TYPE_LABEL;
}else{
return TYPE_CONTENT;
}
}
TYPE_LABEL和TYPE_CONTENT是在类的成员变量中定义的两个整型变量。因为有两种类型的布局所以定义两个变量。
protected static final int TYPE_LABEL = 0;
protected static final int TYPE_CONTENT = 1;
最后一步:就是getView方法里面的核心逻辑
int type=getItemViewType(position)
if(convertView==null){
switch (type) {
case TYPE_LABEL:
labelHolder = new LabelHolder()
convertView=new TextView(getApplicationContext())
labelHolder.text=(TextView) convertView
labelHolder.text.setBackgroundColor(Color.GRAY)
convertView.setTag(labelHolder)
break
case TYPE_CONTENT:
holder=new ViewHolder()
convertView=View.inflate(getApplicationContext(), R.layout.item, null)
holder.fruit_jpg=(ImageView) convertView.findViewById(R.id.iv_fruit)
holder.fruit_text=(TextView) convertView.findViewById(R.id.tv_fruit_text)
convertView.setTag(holder)
break
}
}else{
switch (type) {
case TYPE_LABEL:
labelHolder=(LabelHolder) convertView.getTag()
break
case TYPE_CONTENT:
holder=(ViewHolder) convertView.getTag()
break
}
}
switch (type) {
case TYPE_LABEL:
if(position==0){
labelHolder.text.setText("苹果:")
}else if(position>11){
labelHolder.text.setText("橘子:")
}
break
case TYPE_CONTENT:
if(position>10){
holder.fruit_jpg.setImageResource(R.drawable.orange)
holder.fruit_text.setText("橘子")
}else{
holder.fruit_jpg.setImageResource(R.drawable.apple)
holder.fruit_text.setText("苹果")
}
break
}
return convertView
这额外的两个方法,可以方便的在listview中展示多种布局,本篇博客就是以两种布局为例子来进行讲解的。