155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/* 255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Copyright (C) 2014 The Android Open Source Project 355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * in compliance with the License. You may obtain a copy of the License at 655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * http://www.apache.org/licenses/LICENSE-2.0 855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License 1055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * or implied. See the License for the specific language governing permissions and limitations under 1255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * the License. 1355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 1455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutpackage android.support.v17.leanback.app; 1555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 1655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.app.Fragment; 1755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.os.Bundle; 1855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.support.v17.leanback.widget.ItemBridgeAdapter; 1955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.support.v17.leanback.widget.ListRow; 202f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.ObjectAdapter; 210246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.OnChildViewHolderSelectedListener; 222f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.PresenterSelector; 232f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.Row; 242f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.VerticalGridView; 250246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v7.widget.RecyclerView; 2655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.LayoutInflater; 2755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.View; 2855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.ViewGroup; 2955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 3055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/** 31a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn * An internal base class for a fragment containing a list of rows. 3255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 3355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutabstract class BaseRowFragment extends Fragment { 34fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition"; 3555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout private ObjectAdapter mAdapter; 3699ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas VerticalGridView mVerticalGridView; 3755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout private PresenterSelector mPresenterSelector; 3899ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas ItemBridgeAdapter mBridgeAdapter; 3999ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas int mSelectedPosition = -1; 40902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu private boolean mPendingTransitionPrepare; 41bb0a680c10b84b83833a59634373140f8bd0750csusnata private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver(); 4255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 4342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu abstract int getLayoutResourceId(); 4455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu private final OnChildViewHolderSelectedListener mRowSelectedListener = 460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu new OnChildViewHolderSelectedListener() { 470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu @Override 480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu public void onChildViewHolderSelected(RecyclerView parent, 490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu RecyclerView.ViewHolder view, int position, int subposition) { 500d841b3454f896da58deb506ca22730bfd04f34fDake Gu mSelectedPosition = position; 510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onRowSelected(parent, view, position, subposition); 520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu }; 5455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view, 560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int position, int subposition) { 5755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 5855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 5955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout @Override 607a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu public View onCreateView(LayoutInflater inflater, ViewGroup container, 617a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu Bundle savedInstanceState) { 627a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu View view = inflater.inflate(getLayoutResourceId(), container, false); 637a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu mVerticalGridView = findGridViewFromRoot(view); 64902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu if (mPendingTransitionPrepare) { 65902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mPendingTransitionPrepare = false; 66902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu onTransitionPrepare(); 67902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 687a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu return view; 697a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu } 707a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu 7142752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu VerticalGridView findGridViewFromRoot(View view) { 727a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu return (VerticalGridView) view; 7355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 7455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 7555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout @Override 7655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout public void onViewCreated(View view, Bundle savedInstanceState) { 77fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak if (savedInstanceState != null) { 78fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1); 79fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak } 8055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout if (mBridgeAdapter != null) { 81bb0a680c10b84b83833a59634373140f8bd0750csusnata setAdapterAndSelection(); 82bb0a680c10b84b83833a59634373140f8bd0750csusnata } 83bb0a680c10b84b83833a59634373140f8bd0750csusnata mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener); 84bb0a680c10b84b83833a59634373140f8bd0750csusnata } 85bb0a680c10b84b83833a59634373140f8bd0750csusnata 86bb0a680c10b84b83833a59634373140f8bd0750csusnata /** 87bb0a680c10b84b83833a59634373140f8bd0750csusnata * This class waits for the adapter to be updated before setting the selected 88bb0a680c10b84b83833a59634373140f8bd0750csusnata * row. 89bb0a680c10b84b83833a59634373140f8bd0750csusnata */ 90bb0a680c10b84b83833a59634373140f8bd0750csusnata private class LateSelectionObserver extends RecyclerView.AdapterDataObserver { 91bb0a680c10b84b83833a59634373140f8bd0750csusnata boolean mIsLateSelection = false; 92bb0a680c10b84b83833a59634373140f8bd0750csusnata 9399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas LateSelectionObserver() { 9499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas } 9599ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas 9615375aa6fd54b036f97f99229aefab2822c8a1c9Aurimas Liutikas @Override 97bb0a680c10b84b83833a59634373140f8bd0750csusnata public void onChanged() { 98bb0a680c10b84b83833a59634373140f8bd0750csusnata performLateSelection(); 99bb0a680c10b84b83833a59634373140f8bd0750csusnata } 100bb0a680c10b84b83833a59634373140f8bd0750csusnata 10115375aa6fd54b036f97f99229aefab2822c8a1c9Aurimas Liutikas @Override 102bb0a680c10b84b83833a59634373140f8bd0750csusnata public void onItemRangeInserted(int positionStart, int itemCount) { 103bb0a680c10b84b83833a59634373140f8bd0750csusnata performLateSelection(); 104bb0a680c10b84b83833a59634373140f8bd0750csusnata } 105bb0a680c10b84b83833a59634373140f8bd0750csusnata 106bb0a680c10b84b83833a59634373140f8bd0750csusnata void startLateSelection() { 107bb0a680c10b84b83833a59634373140f8bd0750csusnata mIsLateSelection = true; 108bb0a680c10b84b83833a59634373140f8bd0750csusnata mBridgeAdapter.registerAdapterDataObserver(this); 109bb0a680c10b84b83833a59634373140f8bd0750csusnata } 110bb0a680c10b84b83833a59634373140f8bd0750csusnata 111bb0a680c10b84b83833a59634373140f8bd0750csusnata void performLateSelection() { 112bb0a680c10b84b83833a59634373140f8bd0750csusnata clear(); 113bb0a680c10b84b83833a59634373140f8bd0750csusnata if (mVerticalGridView != null) { 114a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn mVerticalGridView.setSelectedPosition(mSelectedPosition); 11555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 11655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 117bb0a680c10b84b83833a59634373140f8bd0750csusnata 118bb0a680c10b84b83833a59634373140f8bd0750csusnata void clear() { 119bb0a680c10b84b83833a59634373140f8bd0750csusnata if (mIsLateSelection) { 120bb0a680c10b84b83833a59634373140f8bd0750csusnata mIsLateSelection = false; 121bb0a680c10b84b83833a59634373140f8bd0750csusnata mBridgeAdapter.unregisterAdapterDataObserver(this); 122bb0a680c10b84b83833a59634373140f8bd0750csusnata } 123bb0a680c10b84b83833a59634373140f8bd0750csusnata } 124bb0a680c10b84b83833a59634373140f8bd0750csusnata } 125bb0a680c10b84b83833a59634373140f8bd0750csusnata 126bb0a680c10b84b83833a59634373140f8bd0750csusnata void setAdapterAndSelection() { 127bb0a680c10b84b83833a59634373140f8bd0750csusnata mVerticalGridView.setAdapter(mBridgeAdapter); 128bb0a680c10b84b83833a59634373140f8bd0750csusnata // We don't set the selected position unless we've data in the adapter. 129bb0a680c10b84b83833a59634373140f8bd0750csusnata boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0; 130bb0a680c10b84b83833a59634373140f8bd0750csusnata if (lateSelection) { 131bb0a680c10b84b83833a59634373140f8bd0750csusnata mLateSelectionObserver.startLateSelection(); 132bb0a680c10b84b83833a59634373140f8bd0750csusnata } else if (mSelectedPosition >= 0) { 133bb0a680c10b84b83833a59634373140f8bd0750csusnata mVerticalGridView.setSelectedPosition(mSelectedPosition); 134bb0a680c10b84b83833a59634373140f8bd0750csusnata } 13555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 13655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 13755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout @Override 13855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout public void onDestroyView() { 13955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout super.onDestroyView(); 140bb0a680c10b84b83833a59634373140f8bd0750csusnata mLateSelectionObserver.clear(); 141a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn mVerticalGridView = null; 14255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 14355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 144fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak @Override 145fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak public void onSaveInstanceState(Bundle outState) { 146fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak super.onSaveInstanceState(outState); 147fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition); 148fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak } 149fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak 15055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout /** 151cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * Set the presenter selector used to create and bind views. 15255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 153cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu public final void setPresenterSelector(PresenterSelector presenterSelector) { 15455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout mPresenterSelector = presenterSelector; 15555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout updateAdapter(); 15655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 15755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 15855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout /** 159cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * Get the presenter selector used to create and bind views. 160cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu */ 161cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu public final PresenterSelector getPresenterSelector() { 162cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu return mPresenterSelector; 163cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu } 164cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu 165cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu /** 16655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Sets the adapter for the fragment. 16755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 168cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu public final void setAdapter(ObjectAdapter rowsAdapter) { 16955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout mAdapter = rowsAdapter; 17055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout updateAdapter(); 17155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 17255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 17355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout /** 17455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Returns the list of rows. 17555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 17655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout public final ObjectAdapter getAdapter() { 17755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout return mAdapter; 17855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 17955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 18055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout /** 18155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Returns the bridge adapter. 18255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 18342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu final ItemBridgeAdapter getBridgeAdapter() { 18455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout return mBridgeAdapter; 18555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 18655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 18755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout /** 1883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position with smooth animation. 18955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 190025aa57d4fdd4e79289303c7dc54169311728f7bCraig Stout public void setSelectedPosition(int position) { 1913f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu setSelectedPosition(position, true); 1923f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1933f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1943f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 1950d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu * Gets position of currently selected row. 1960d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu * @return Position of currently selected row. 1970d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu */ 1982f1bd591e01fe93f605844d4a10cde7116315b7cDake Gu public int getSelectedPosition() { 1990d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu return mSelectedPosition; 2000d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu } 2010d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu 2020d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu /** 2033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position. 2043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 2053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position, boolean smooth) { 2060d841b3454f896da58deb506ca22730bfd04f34fDake Gu if (mSelectedPosition == position) { 2070d841b3454f896da58deb506ca22730bfd04f34fDake Gu return; 2080d841b3454f896da58deb506ca22730bfd04f34fDake Gu } 20955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout mSelectedPosition = position; 210a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) { 211bb0a680c10b84b83833a59634373140f8bd0750csusnata if (mLateSelectionObserver.mIsLateSelection) { 212bb0a680c10b84b83833a59634373140f8bd0750csusnata return; 213bb0a680c10b84b83833a59634373140f8bd0750csusnata } 2143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (smooth) { 2153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mVerticalGridView.setSelectedPositionSmooth(position); 2163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } else { 2173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mVerticalGridView.setSelectedPosition(position); 2183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 21955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 22055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 22155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 222a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn final VerticalGridView getVerticalGridView() { 223a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn return mVerticalGridView; 22455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 22555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 22642752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu void updateAdapter() { 227e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu if (mBridgeAdapter != null) { 228e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu // detach observer from ObjectAdapter 229bb0a680c10b84b83833a59634373140f8bd0750csusnata mLateSelectionObserver.clear(); 230e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu mBridgeAdapter.clear(); 231e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu mBridgeAdapter = null; 232e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu } 23355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 23455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout if (mAdapter != null) { 23555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout // If presenter selector is null, adapter ps will be used 23655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector); 23755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 238a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn if (mVerticalGridView != null) { 239bb0a680c10b84b83833a59634373140f8bd0750csusnata setAdapterAndSelection(); 24055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 24155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 24255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 24342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu Object getItem(Row row, int position) { 24455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout if (row instanceof ListRow) { 24555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout return ((ListRow) row).getAdapter().get(position); 24655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } else { 24755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout return null; 24855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 24955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 2502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2512f5ebf3f6f7bb6a24856f389e369b247118ba119susnata public boolean onTransitionPrepare() { 2522f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu if (mVerticalGridView != null) { 2532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu mVerticalGridView.setAnimateChildLayout(false); 254902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mVerticalGridView.setScrollEnabled(false); 255902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu return true; 2562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 257902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mPendingTransitionPrepare = true; 258902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu return false; 259902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 260902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu 2612f5ebf3f6f7bb6a24856f389e369b247118ba119susnata public void onTransitionStart() { 2624a4e0872bdf0548188e81740eb62085215e7f976Dake Gu if (mVerticalGridView != null) { 2634a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setPruneChild(false); 2644a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setLayoutFrozen(true); 2654a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setFocusSearchDisabled(true); 2664a4e0872bdf0548188e81740eb62085215e7f976Dake Gu } 2672f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2682f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2692f5ebf3f6f7bb6a24856f389e369b247118ba119susnata public void onTransitionEnd() { 2704a4e0872bdf0548188e81740eb62085215e7f976Dake Gu // be careful that fragment might be destroyed before header transition ends. 2714a4e0872bdf0548188e81740eb62085215e7f976Dake Gu if (mVerticalGridView != null) { 2724a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setLayoutFrozen(false); 2734a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setAnimateChildLayout(true); 2744a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setPruneChild(true); 2754a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setFocusSearchDisabled(false); 2764a4e0872bdf0548188e81740eb62085215e7f976Dake Gu mVerticalGridView.setScrollEnabled(true); 2774a4e0872bdf0548188e81740eb62085215e7f976Dake Gu } 2782f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 279e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu 2802f5ebf3f6f7bb6a24856f389e369b247118ba119susnata public void setAlignment(int windowAlignOffsetTop) { 281e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu if (mVerticalGridView != null) { 282e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu // align the top edge of item 283e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu mVerticalGridView.setItemAlignmentOffset(0); 284e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu mVerticalGridView.setItemAlignmentOffsetPercent( 285e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 286e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu 287e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu // align to a fixed position from top 2882f5ebf3f6f7bb6a24856f389e369b247118ba119susnata mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop); 289e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu mVerticalGridView.setWindowAlignmentOffsetPercent( 290e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 291e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 292e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu } 293e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu } 29455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout} 295