gt: 			View view = mRecycleBin.get( viewType ).poll();
context: /*
   * Copyright (C) 2006 The Android Open Source Project Licensed under the Apache License,
   * Version 2.0 (the "License"); you may not
   * use this file except in compliance with the License. You may obtain a copy of the
   * License at
   * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed
   * to in writing, software distributed under
   * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied. See the
   * License for the specific language governing permissions and limitations under the
   * License.
   */
  
  package com.aviary.android.feather.widget;
  
  import java.util.ArrayList;
  import java.util.LinkedList;
  import java.util.List;
  import java.util.Queue;
  
  import android.content.Context;
  import android.database.DataSetObserver;
  import android.graphics.Rect;
  import android.os.Parcel;
  import android.os.Parcelable;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.Adapter;
  
  public abstract class AviaryAbsSpinner extends AviaryAdapterView<Adapter> {
  
  	Adapter mAdapter;
  
  	int mHeightMeasureSpec;
  
  	int mWidthMeasureSpec;
  
  	boolean mBlockLayoutRequests;
  
  	int mSelectionLeftPadding = 0;
  
  	int mSelectionTopPadding = 0;
  
  	int mSelectionRightPadding = 0;
  
  	int mSelectionBottomPadding = 0;
  
  	final Rect mSpinnerPadding = new Rect();
  
  	int mPaddingLeft;
  
  	int mPaddingRight;
  
  	int mPaddingTop;
  
  	int mPaddingBottom;
  
  	protected final List<Queue<View>> mRecycleBin;
  
  	private DataSetObserver mDataSetObserver;
  
  	private Rect mTouchFrame;
  
  	public AviaryAbsSpinner ( Context context ) {
  		this( context, null );
  	}
  
  	public AviaryAbsSpinner ( Context context, AttributeSet attrs ) {
  		this( context, attrs, 0 );
  	}
  
  	public AviaryAbsSpinner ( Context context, AttributeSet attrs, int defStyle ) {
  		super( context, attrs, defStyle );
  		mRecycleBin = new ArrayList<Queue<View>>( 10 );
  		initAbsSpinner();
  	}
  
  	@Override
  	public void setPadding( int left, int top, int right, int bottom ) {
  		super.setPadding( left, top, right, bottom );
  		mPaddingLeft = left;
  		mPaddingBottom = bottom;
  		mPaddingTop = top;
  		mPaddingRight = right;
  	}
  
  	private void initAbsSpinner() {
  		setFocusable( true );
  		setWillNotDraw( false );
  	}
  
  	int mDefaultPosition;
  
  	/**
  	 * Set the default selected position.
  	 * This method has effects only if called before setting the new adapter
  	 * 
  	 * @param position
  	 */
  	public void setDefaultPosition( int position ) {
  		mDefaultPosition = position;
  	}
  
  	@Override
  	public void setAdapter( Adapter adapter ) {
  		if ( null != mAdapter ) {
  			mAdapter.unregisterDataSetObserver( mDataSetObserver );
  			emptyRecycler();
  			resetList();
  		}
  
  		mAdapter = adapter;
  
  		mOldSelectedPosition = INVALID_POSITION;
  		mOldSelectedRowId = INVALID_ROW_ID;
  
  		if ( mAdapter != null ) {
  			mOldItemCount = mItemCount;
  			mItemCount = mAdapter.getCount();
  			checkFocus();
  
  			mDataSetObserver = new AdapterDataSetObserver();
  			mAdapter.registerDataSetObserver( mDataSetObserver );
  
  			int position;
  			if ( mDefaultPosition >= 0 && mDefaultPosition < mItemCount ) {
  				position = mDefaultPosition;
  			} else {
  				position = mItemCount > 0 ? 0 : INVALID_POSITION;
  			}
  
  			int total = mAdapter.getViewTypeCount();
  			for ( int i = 0; i < total; i++ ) {
  				mRecycleBin.add( new LinkedList<View>() );
  			}
  
  			setSelectedPositionInt( position );
  			setNextSelectedPositionInt( position );
  
  			if ( mItemCount == 0 ) {
  				// Nothing selected
  				checkSelectionChanged();
  			}
  
  		} else {
  			checkFocus();
  			resetList();
  			// Nothing selected
  			checkSelectionChanged();
  		}
  
  		requestLayout();
  	}
  
  	private void emptyRecycler() {
  		emptySubRecycler();
  		if ( null != mRecycleBin ) {
  			mRecycleBin.clear();
  		}
  	}
  
  	protected void emptySubRecycler() {
  		if ( null != mRecycleBin ) {
  			for ( int i = 0; i < mRecycleBin.size(); i++ ) {
  				mRecycleBin.get( i ).clear();
  			}
  		}
  	}
  
  	void resetList() {
  		Log.i( VIEW_LOG_TAG, "emptyList" );
  		mDataChanged = false;
  		mNeedSync = false;
  
  		removeAllViewsInLayout();
  		emptyRecycler();
  
  		mOldSelectedPosition = INVALID_POSITION;
  		mOldSelectedRowId = INVALID_ROW_ID;
  
  		setSelectedPositionInt( INVALID_POSITION );
  		setNextSelectedPositionInt( INVALID_POSITION );
  		invalidate();
  	}
  
  	@Override
  	protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) {
  		int widthMode = MeasureSpec.getMode( widthMeasureSpec );
  		int widthSize;
  		int heightSize;
  
  		mSpinnerPadding.left = mPaddingLeft > mSelectionLeftPadding ? mPaddingLeft : mSelectionLeftPadding;
  		mSpinnerPadding.top = mPaddingTop > mSelectionTopPadding ? mPaddingTop : mSelectionTopPadding;
  		mSpinnerPadding.right = mPaddingRight > mSelectionRightPadding ? mPaddingRight : mSelectionRightPadding;
  		mSpinnerPadding.bottom = mPaddingBottom > mSelectionBottomPadding ? mPaddingBottom : mSelectionBottomPadding;
  
  		if ( mDataChanged ) {
  			handleDataChanged();
  		}
  
  		int preferredHeight = 0;
  		int preferredWidth = 0;
  		boolean needsMeasuring = true;
  
  		int selectedPosition = getSelectedItemPosition();
  		if ( selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount() ) {
  			// Try looking in the recycler. (Maybe we were measured once already)
  
  			int viewType = mAdapter.getItemViewType( selectedPosition );
  