http://www.cnblogs.com/devinzhang/archive/2012/07/02/2573554.html
传送门
看了这篇大概了解了listview不同item的东西,在adapter里首先设置几个type类型,然后复写
public int getItemViewType(int position) { return super.getItemViewType(position); }这里每一个item都会有一个type了
@Override public int getViewTypeCount() { // TODO Auto-generated method stub return 3; }这是有3个类型的item
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) { Log.e("convertView = ", " NULL"); //按当前所需的样式,确定new的布局 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); Log.e("convertView = ", "NULL TYPE_1"); 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); Log.e("convertView = ", "NULL TYPE_2"); 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); Log.e("convertView = ", "NULL TYPE_3"); convertView.setTag(holder3); break; } }else{ //有convertView,按样式,取得不用的布局 switch(type) { case TYPE_1: holder1 = (viewHolder1) convertView.getTag(); Log.e("convertView !!!!!!= ", "NULL TYPE_1"); break; case TYPE_2: holder2 = (viewHolder2) convertView.getTag(); Log.e("convertView !!!!!!= ", "NULL TYPE_2"); break; case TYPE_3: holder3 = (viewHolder3) convertView.getTag(); Log.e("convertView !!!!!!= ", "NULL TYPE_3"); break; }这是核心的东西了,就是做一个switch判断并复用的,填充3个布局,根据type的类型去复用哪个view