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

来源:互联网 发布:网页分类算法 编辑:程序博客网 时间:2024/05/22 01:44

一、问题的引出

如何在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);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mListString.size();}//每个convert view 都会调用此方法,获得当前所需要的view样式@Overridepublic 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;}}@Overridepublic int getViewTypeCount() {return 3;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mListString.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHolder1 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

0 0