AbsSpinner.java revision afc0155718ceb6b14d78dffc5590bd359511be8b
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObserver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An abstract base class for spinner widgets. SDK users will probably not
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to use this class.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AbsSpinner_entries
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SpinnerAdapter mAdapter;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeightMeasureSpec;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidthMeasureSpec;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mBlockLayoutRequests;
44afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionLeftPadding = 0;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionTopPadding = 0;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionRightPadding = 0;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionBottomPadding = 0;
49afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy    final Rect mSpinnerPadding = new Rect();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy    final RecycleBin mRecycler = new RecycleBin();
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DataSetObserver mDataSetObserver;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Temporary frame to hold a child View's frame rectangle */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Rect mTouchFrame;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initAbsSpinner();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context, AttributeSet attrs) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context, AttributeSet attrs, int defStyle) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initAbsSpinner();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AbsSpinner, defStyle, 0);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entries != null) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayAdapter<CharSequence> adapter =
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new ArrayAdapter<CharSequence>(context,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            R.layout.simple_spinner_item, entries);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setAdapter(adapter);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Common code for different constructor flavors
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initAbsSpinner() {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFocusable(true);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setWillNotDraw(false);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Adapter is used to provide the data which backs this Spinner.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It also provides methods to transform spinner items based on their position
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * relative to the selected item.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param adapter The SpinnerAdapter to use for this Spinner
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAdapter(SpinnerAdapter adapter) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (null != mAdapter) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAdapter.unregisterDataSetObserver(mDataSetObserver);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resetList();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdapter = adapter;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedPosition = INVALID_POSITION;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedRowId = INVALID_ROW_ID;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAdapter != null) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOldItemCount = mItemCount;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mItemCount = mAdapter.getCount();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkFocus();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataSetObserver = new AdapterDataSetObserver();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAdapter.registerDataSetObserver(mDataSetObserver);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int position = mItemCount > 0 ? 0 : INVALID_POSITION;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setSelectedPositionInt(position);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setNextSelectedPositionInt(position);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mItemCount == 0) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Nothing selected
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkSelectionChanged();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkFocus();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resetList();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Nothing selected
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkSelectionChanged();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestLayout();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear out all children from the list
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void resetList() {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataChanged = false;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNeedSync = false;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeAllViewsInLayout();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedPosition = INVALID_POSITION;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedRowId = INVALID_ROW_ID;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSelectedPositionInt(INVALID_POSITION);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNextSelectedPositionInt(INVALID_POSITION);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View#measure(int, int)
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figure out the dimensions of this Spinner. The width comes from
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the widthMeasureSpec as Spinnners can't have their width set to
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UNSPECIFIED. The height is based on the height of the selected item
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * plus padding.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int widthSize;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int heightSize;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.left = mPaddingLeft > mSelectionLeftPadding ? mPaddingLeft
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionLeftPadding;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.top = mPaddingTop > mSelectionTopPadding ? mPaddingTop
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionTopPadding;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.right = mPaddingRight > mSelectionRightPadding ? mPaddingRight
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionRightPadding;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.bottom = mPaddingBottom > mSelectionBottomPadding ? mPaddingBottom
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionBottomPadding;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDataChanged) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleDataChanged();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int preferredHeight = 0;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int preferredWidth = 0;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean needsMeasuring = true;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int selectedPosition = getSelectedItemPosition();
187afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Try looking in the recycler. (Maybe we were measured once already)
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View view = mRecycler.get(selectedPosition);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view == null) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Make a new one
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view = mAdapter.getView(selectedPosition, null, this);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view != null) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put in recycler for re-measuring and/or layout
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecycler.put(selectedPosition, view);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view != null) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view.getLayoutParams() == null) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlockLayoutRequests = true;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    view.setLayoutParams(generateDefaultLayoutParams());
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlockLayoutRequests = false;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                measureChild(view, widthMeasureSpec, heightMeasureSpec);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                needsMeasuring = false;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needsMeasuring) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No views -- just use padding
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (widthMode == MeasureSpec.UNSPECIFIED) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight());
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        heightSize = resolveSize(preferredHeight, heightMeasureSpec);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        widthSize = resolveSize(preferredWidth, widthMeasureSpec);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(widthSize, heightSize);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeightMeasureSpec = heightMeasureSpec;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidthMeasureSpec = widthMeasureSpec;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getChildHeight(View child) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return child.getMeasuredHeight();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getChildWidth(View child) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return child.getMeasuredWidth();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ViewGroup.LayoutParams(
245980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewGroup.LayoutParams.WRAP_CONTENT);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void recycleAllViews() {
250afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        final int childCount = getChildCount();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AbsSpinner.RecycleBin recycleBin = mRecycler;
252afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        final int position = mFirstPosition;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // All views go in recycler
255afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        for (int i = 0; i < childCount; i++) {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View v = getChildAt(i);
257afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy            int index = position + i;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recycleBin.put(index, v);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Jump directly to a specific item in the adapter data.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int position, boolean animate) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Animate only if requested position is already on screen somewhere
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean shouldAnimate = animate && mFirstPosition <= position &&
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                position <= mFirstPosition + getChildCount() - 1;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSelectionInt(position, shouldAnimate);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int position) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNextSelectedPositionInt(position);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestLayout();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Makes the item at the supplied position selected.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param position Position to select
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param animate Should the transition be animated
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setSelectionInt(int position, boolean animate) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (position != mOldSelectedPosition) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlockLayoutRequests = true;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int delta  = position - mSelectedPosition;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setNextSelectedPositionInt(position);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            layout(delta, animate);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlockLayoutRequests = false;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    abstract void layout(int delta, boolean animate);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getSelectedView() {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mItemCount > 0 && mSelectedPosition >= 0) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getChildAt(mSelectedPosition - mFirstPosition);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override to prevent spamming ourselves with layout requests
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as we place views
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View#requestLayout()
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mBlockLayoutRequests) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.requestLayout();
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SpinnerAdapter getAdapter() {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAdapter;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getCount() {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mItemCount;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maps a point to a position in the list.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x X in local coordinate
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y Y in local coordinate
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The position of the item which contains the specified point, or
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #INVALID_POSITION} if the point does not intersect an item.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int pointToPosition(int x, int y) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect frame = mTouchFrame;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (frame == null) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTouchFrame = new Rect();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            frame = mTouchFrame;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = count - 1; i >= 0; i--) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View child = getChildAt(i);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (child.getVisibility() == View.VISIBLE) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.getHitRect(frame);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (frame.contains(x, y)) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mFirstPosition + i;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return INVALID_POSITION;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class SavedState extends BaseSavedState {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long selectedId;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int position;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor called from {@link AbsSpinner#onSaveInstanceState()}
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState(Parcelable superState) {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor called from {@link #CREATOR}
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private SavedState(Parcel in) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(in);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            selectedId = in.readLong();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = in.readInt();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, int flags) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.writeToParcel(out, flags);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(selectedId);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(position);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "AbsSpinner.SavedState{"
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Integer.toHexString(System.identityHashCode(this))
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " selectedId=" + selectedId
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " position=" + position + "}";
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<SavedState> CREATOR
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new Parcelable.Creator<SavedState>() {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState createFromParcel(Parcel in) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState(in);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState[] newArray(int size) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState[size];
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Parcelable onSaveInstanceState() {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcelable superState = super.onSaveInstanceState();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = new SavedState(superState);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ss.selectedId = getSelectedItemId();
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ss.selectedId >= 0) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ss.position = getSelectedItemPosition();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ss.position = INVALID_POSITION;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ss;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onRestoreInstanceState(Parcelable state) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = (SavedState) state;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(ss.getSuperState());
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ss.selectedId >= 0) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataChanged = true;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNeedSync = true;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncRowId = ss.selectedId;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncPosition = ss.position;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncMode = SYNC_SELECTED_POSITION;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecycleBin {
436afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        private final SparseArray<View> mScrapHeap = new SparseArray<View>();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void put(int position, View v) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrapHeap.put(position, v);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View get(int position) {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System.out.print("Looking for " + position);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View result = mScrapHeap.get(position);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (result != null) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // System.out.println(" HIT");
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrapHeap.delete(position);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // System.out.println(" MISS");
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
453afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void clear() {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final SparseArray<View> scrapHeap = mScrapHeap;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = scrapHeap.size();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View view = scrapHeap.valueAt(i);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    removeDetachedView(view, true);
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrapHeap.clear();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
467