android开发中Listview中显示不同的视图布局

一、问题的引出

如何在listview的不同位置显示不同类型的内容,如在某一行显示广告,其他行显示文本?

二、问题的简答

自定义Adapter,复写BaseAdapter中的getItemViewType(int position)方法,根据listview的位置号, 通过一定的算法去返回不同类型的视图布局。然后在复写getView方法中,根据获得的视图布局类型,去加载特定的布局。这样就实现了在一个listview中去加载多种不同类型的视图布局。
实例代码:
public class MyAdapter extends BaseAdapter {

	Context mContext;
	LinearLayout linearLayout=null;
	LayoutInflater inflater;
	TextView tex;
	ArrayList<String> mListString;
	
	final int VIEW_TYPE=3;
	final int TYPE_1=0;
	final int TYPE_2=1;
	final int TYPE_3=2;
	
	public MyAdapter() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public MyAdapter(Context context,ArrayList<String> listString){
		mContext=context;
		mListString=listString;
		inflater=LayoutInflater.from(mContext);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mListString.size();
	}
	
	//每个convert view 都会调用此方法,获得当前所需要的view样式
	@Override
	public int getItemViewType(int position) {
		
		int p=position%6;
		
		if (p==0) {
			return TYPE_1;
		}else if (p<3) {
			return TYPE_2;
		}else if (p<6) {
			return TYPE_3;
		}else {
			return TYPE_1;
		}
		
		
		
	}
	
	@Override
	public int getViewTypeCount() {
		
		return 3;

	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return mListString.get(position);
	}

	@Override
	public long 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
		ViewHolder1 holder1=null;
		ViewHolder2 holder2=null;
		ViewHolder3 holder3=null;
		
		int type=getItemViewType(position);
		
		//如果没有convertView,需要new出各个控件
		if (convertView==null) {
			switch (type) {
			case TYPE_1:
				convertView=inflater.inflate(R.layout.listitem1,parent,false);
				holder1=new ViewHolder1();
				holder1.textView=(TextView) convertView.findViewById(R.id.textview1);
				holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
				convertView.setTag(holder1);
				break;
			case TYPE_2:
				convertView = inflater.inflate(R.layout.listitem2, parent, false);
				holder2 = new ViewHolder2();
				holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
				
				convertView.setTag(holder2);
				break;
			case TYPE_3:
				convertView = inflater.inflate(R.layout.listitem3, parent, false);
				holder3 = new ViewHolder3();
				holder3.textView = (TextView)convertView.findViewById(R.id.textview3);
				holder3.imageView = (ImageView)convertView.findViewById(R.id.imageview);
				
				convertView.setTag(holder3);
				break;

			default:
				break;
			}
		}else {//有convertView,按样式,取得不同的布局
			
			switch (type) {
			case TYPE_1:
				holder1=(ViewHolder1) convertView.getTag();
				
				break;
			case TYPE_2:
				holder2=(ViewHolder2) convertView.getTag();
				break;
			case TYPE_3:
				holder3=(ViewHolder3) convertView.getTag();
				break;
				

			default:
				break;
			}
		}
		
		//设置资源
		switch (type) {
		case TYPE_1:
			holder1.textView.setText(getItem(position).toString());
			holder1.checkBox.setChecked(true);
			break;
		case TYPE_2:
			holder2.textView.setText(getItem(position).toString());
			break;
		case TYPE_3:
			holder3.textView.setText(Integer.toString(position));
			holder3.imageView.setBackgroundResource(R.drawable.ic_launcher);
			break;
		default:
			break;
		}
		
		return convertView;
	}
	
	
}

/**
 * 各个布局的控件资源
 * @author ly
 *
 */
class ViewHolder1{
	CheckBox checkBox;
	TextView textView;
}

class ViewHolder2{
	TextView textView;
	
}

class ViewHolder3{
	ImageView imageView;
	TextView textView;
}

三、参考资料

1.android开发中Listview中显示不同的视图布局:
http://m.android100.org/?host=www.android100.org&src=http%3A%2F%2Fwww.android100.org%2Fhtml%2F201401%2F31%2F5433.html
2. ListView 之 viewType 解析

总结理解

listview的viewtype机制通过对列表item的不同类型,用以在列表中加载不同的内容,如一行广告,一行新闻. 基本在于mScrapView和mActiveView数组先以type做行,然后各个类型的item在加入到具体对应type的数组中.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值