在使用不同布局的时候,getItemViewType和getViewType不能少,通常是不用这两个函数的重载的
listView.setAdapter(new BaseAdapter() { @Override public int getViewTypeCount() {//例:3种类型的布局 return 3; } @Override public int getItemViewType(int position) { //该方法很重要。adapter内部会自己主动调用该方法。然后依据该类型得到缓存的view(可能为null),并传给getView方法//的convertView參数,假设该类型相应的view已被缓存过,则getView中的convertView就不为null //返回的类型要小于getViewTypeCount(),否则会报数组越界 if (position==20||position==40||position==60) { return 1; } if (position==25||position==45||position==65) { return 2; } return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub int type=getItemViewType(position); System.out.println("getView "+position+" "+convertView+" "+type); if (convertView==null) { if (type==0) { TextView tv=new TextView(getApplicationContext()); tv.setText(""+position); tv.setPadding(20, 20, 20, 20); tv.setTextColor(Color.BLACK); convertView=tv; }else if(type==1){ TextView tv=new TextView(getApplicationContext()); tv.setText(""+position); tv.setPadding(20, 10, 10, 10); tv.setTextColor(Color.BLACK); tv.setBackgroundColor(Color.GREEN); convertView=tv; }else{ ImageView iv=new ImageView(getApplicationContext()); iv.setImageResource(R.drawable.ic_launcher); convertView=iv; } } switch (type) { //依据类型就能够大胆的强转了,不会抛异常的 case 0: TextView tv=(TextView) convertView; tv.setText(""+position); break; case 1: tv=(TextView) convertView; tv.setText(""+position); break; case 2: ImageView iv=(ImageView) convertView; break; } return convertView; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public int getCount() { // TODO Auto-generated method stub return 5000; } }); // 为了验证getView的convertView參数是我们想要的view, 控件高度要高一些。保证同一屏不会出现两个绿色背景textview或imageview //能够看到20 25位置是第一次出现绿色背景textview和imagerview的位置,相应的convertView为null,40 45位置相应的convertView不为null。传进来的是已经缓存过的view