ListView显示不同布局


在使用不同布局的时候,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


 

 

 

 

 

 

 

 

 

 

posted @ 2017-08-14 14:14  cxchanpin  阅读(317)  评论(0编辑  收藏  举报