VerticalGridFragment.java revision 60e00f895b6f4dd25f181f377adf98e0715be4b6
1739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/*
2739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Copyright (C) 2014 The Android Open Source Project
3739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
4739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * in compliance with the License. You may obtain a copy of the License at
6739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
7739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
8739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
9739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
10739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
12739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * the License.
13739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
14739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpackage android.support.v17.leanback.app;
15739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
162452cde3b8d7cbe62f6eb2fbcbcf9a02448d6891Dake Guimport android.os.Bundle;
17739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.R;
188403619efebe94666c0615c3fc85080a303acf80Dake Guimport android.support.v17.leanback.transition.TransitionHelper;
1989097f67f988ebba714a95e10369665280db0c27Dake Guimport android.support.v17.leanback.util.StateMachine.State;
205d00775a5d3ce3c1fc06c4de0945d1b8f03aadc4Dake Guimport android.support.v17.leanback.widget.BrowseFrameLayout;
212452cde3b8d7cbe62f6eb2fbcbcf9a02448d6891Dake Guimport android.support.v17.leanback.widget.ObjectAdapter;
22d586ba8825b418d9589436725bfdead30f0dc075Dake Guimport android.support.v17.leanback.widget.OnChildLaidOutListener;
23947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
24947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
25947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.Presenter;
26e34cae48707e70442aca13e1b4ab55757292828dDake Guimport android.support.v17.leanback.widget.Row;
27947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.RowPresenter;
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.VerticalGridPresenter;
2925aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.util.Log;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
32739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
354c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * A fragment for creating leanback vertical grids.
36739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
374c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * an {@link ObjectAdapter}.
39739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
40786ba352397f44022617411936515fc9eb28d23fDake Gupublic class VerticalGridFragment extends BaseFragment {
4160e00f895b6f4dd25f181f377adf98e0715be4b6Dake Gu    static final String TAG = "VerticalGF";
4299ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    static boolean DEBUG = false;
43739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
44739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ObjectAdapter mAdapter;
45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter mGridPresenter;
4699ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    VerticalGridPresenter.ViewHolder mGridViewHolder;
4799ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    OnItemViewSelectedListener mOnItemViewSelectedListener;
48947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemViewClickedListener mOnItemViewClickedListener;
49786ba352397f44022617411936515fc9eb28d23fDake Gu    private Object mSceneAfterEntranceTransition;
50739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mSelectedPosition = -1;
51739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
52dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    /**
5389097f67f988ebba714a95e10369665280db0c27Dake Gu     * State to setEntranceTransitionState(false)
5489097f67f988ebba714a95e10369665280db0c27Dake Gu     */
5589097f67f988ebba714a95e10369665280db0c27Dake Gu    final State STATE_SET_ENTRANCE_START_STATE = new State("SET_ENTRANCE_START_STATE") {
5689097f67f988ebba714a95e10369665280db0c27Dake Gu        @Override
5789097f67f988ebba714a95e10369665280db0c27Dake Gu        public void run() {
5889097f67f988ebba714a95e10369665280db0c27Dake Gu            setEntranceTransitionState(false);
5989097f67f988ebba714a95e10369665280db0c27Dake Gu        }
6089097f67f988ebba714a95e10369665280db0c27Dake Gu    };
6189097f67f988ebba714a95e10369665280db0c27Dake Gu
6289097f67f988ebba714a95e10369665280db0c27Dake Gu    @Override
6389097f67f988ebba714a95e10369665280db0c27Dake Gu    void createStateMachineStates() {
6489097f67f988ebba714a95e10369665280db0c27Dake Gu        super.createStateMachineStates();
6589097f67f988ebba714a95e10369665280db0c27Dake Gu        mStateMachine.addState(STATE_SET_ENTRANCE_START_STATE);
6689097f67f988ebba714a95e10369665280db0c27Dake Gu    }
6789097f67f988ebba714a95e10369665280db0c27Dake Gu
6889097f67f988ebba714a95e10369665280db0c27Dake Gu    @Override
6989097f67f988ebba714a95e10369665280db0c27Dake Gu    void createStateMachineTransitions() {
7089097f67f988ebba714a95e10369665280db0c27Dake Gu        super.createStateMachineTransitions();
7189097f67f988ebba714a95e10369665280db0c27Dake Gu        mStateMachine.addTransition(STATE_ENTRANCE_ON_PREPARED,
7289097f67f988ebba714a95e10369665280db0c27Dake Gu                STATE_SET_ENTRANCE_START_STATE, EVT_ON_CREATEVIEW);
7389097f67f988ebba714a95e10369665280db0c27Dake Gu    }
7489097f67f988ebba714a95e10369665280db0c27Dake Gu
7589097f67f988ebba714a95e10369665280db0c27Dake Gu    /**
76dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Sets the grid presenter.
77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
79739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (gridPresenter == null) {
80739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Grid presenter may not be null");
81739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
82739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridPresenter = gridPresenter;
83d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener);
84947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        if (mOnItemViewClickedListener != null) {
85947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
86947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        }
87739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
88739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
89739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
90739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the grid presenter.
91739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
92739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter getGridPresenter() {
93739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mGridPresenter;
94739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
95739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
96739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
97739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the object adapter for the fragment.
98739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
99739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setAdapter(ObjectAdapter adapter) {
100739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mAdapter = adapter;
101739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
102739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
103739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
104739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
105739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the object adapter.
106739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
107739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public ObjectAdapter getAdapter() {
108739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mAdapter;
109739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
111d586ba8825b418d9589436725bfdead30f0dc075Dake Gu    final private OnItemViewSelectedListener mViewSelectedListener =
112947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            new OnItemViewSelectedListener() {
113e34cae48707e70442aca13e1b4ab55757292828dDake Gu        @Override
114947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
115947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
116e34cae48707e70442aca13e1b4ab55757292828dDake Gu            int position = mGridViewHolder.getGridView().getSelectedPosition();
117d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            if (DEBUG) Log.v(TAG, "grid selected position " + position);
118d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            gridOnItemSelected(position);
119947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            if (mOnItemViewSelectedListener != null) {
120947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
121947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                        rowViewHolder, row);
122947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            }
123e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
124e34cae48707e70442aca13e1b4ab55757292828dDake Gu    };
125e34cae48707e70442aca13e1b4ab55757292828dDake Gu
126d586ba8825b418d9589436725bfdead30f0dc075Dake Gu    final private OnChildLaidOutListener mChildLaidOutListener =
127d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            new OnChildLaidOutListener() {
128d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        @Override
129d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        public void onChildLaidOut(ViewGroup parent, View view, int position, long id) {
130d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            if (position == 0) {
131d586ba8825b418d9589436725bfdead30f0dc075Dake Gu                showOrHideTitle();
132d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            }
133d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        }
134d586ba8825b418d9589436725bfdead30f0dc075Dake Gu    };
135d586ba8825b418d9589436725bfdead30f0dc075Dake Gu
136739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
137739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item selection listener.
138947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
139947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
140947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewSelectedListener = listener;
141947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
142947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
14399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    void gridOnItemSelected(int position) {
144e34cae48707e70442aca13e1b4ab55757292828dDake Gu        if (position != mSelectedPosition) {
145e34cae48707e70442aca13e1b4ab55757292828dDake Gu            mSelectedPosition = position;
146d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            showOrHideTitle();
147d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        }
148d586ba8825b418d9589436725bfdead30f0dc075Dake Gu    }
149d586ba8825b418d9589436725bfdead30f0dc075Dake Gu
15099ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    void showOrHideTitle() {
151d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition)
152d586ba8825b418d9589436725bfdead30f0dc075Dake Gu                == null) {
153d586ba8825b418d9589436725bfdead30f0dc075Dake Gu            return;
154d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        }
155d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) {
156e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout            showTitle(true);
157e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout        } else {
158e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout            showTitle(false);
159e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
160e34cae48707e70442aca13e1b4ab55757292828dDake Gu    }
161739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
162739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
163739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item clicked listener.
164947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
165947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
166947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewClickedListener = listener;
167947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        if (mGridPresenter != null) {
168947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
169947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        }
170947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
171947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
172947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
173947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Returns the item clicked listener.
174947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
175947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public OnItemViewClickedListener getOnItemViewClickedListener() {
176947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        return mOnItemViewClickedListener;
177947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
178947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
179739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
180739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
181739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            Bundle savedInstanceState) {
182e34cae48707e70442aca13e1b4ab55757292828dDake Gu        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
183e34cae48707e70442aca13e1b4ab55757292828dDake Gu                container, false);
184a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        ViewGroup gridFrame = (ViewGroup) root.findViewById(R.id.grid_frame);
185a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu        installTitleView(inflater, gridFrame, savedInstanceState);
186684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        getProgressBarManager().setRootView(root);
1879020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
18889097f67f988ebba714a95e10369665280db0c27Dake Gu        ViewGroup gridDock = (ViewGroup) root.findViewById(R.id.browse_grid_dock);
189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        gridDock.addView(mGridViewHolder.view);
191d586ba8825b418d9589436725bfdead30f0dc075Dake Gu        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
1938403619efebe94666c0615c3fc85080a303acf80Dake Gu        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
194786ba352397f44022617411936515fc9eb28d23fDake Gu            @Override
195786ba352397f44022617411936515fc9eb28d23fDake Gu            public void run() {
196786ba352397f44022617411936515fc9eb28d23fDake Gu                setEntranceTransitionState(true);
197786ba352397f44022617411936515fc9eb28d23fDake Gu            }
198786ba352397f44022617411936515fc9eb28d23fDake Gu        });
199786ba352397f44022617411936515fc9eb28d23fDake Gu
200739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
20189097f67f988ebba714a95e10369665280db0c27Dake Gu        return root;
202739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
203739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
204e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout    private void setupFocusSearchListener() {
205e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout        BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById(
206e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout                R.id.grid_frame);
207e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout        browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener());
208e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout    }
209e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout
210739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
211739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onStart() {
212739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onStart();
213e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout        setupFocusSearchListener();
214739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
215739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
216739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onDestroyView() {
218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onDestroyView();
219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = null;
220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
221739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the selected item position.
224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
225739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setSelectedPosition(int position) {
226739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSelectedPosition = position;
227739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
228739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
229739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
230739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
231739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
232739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void updateAdapter() {
233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridViewHolder != null) {
234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            if (mSelectedPosition != -1) {
236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
239739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
240786ba352397f44022617411936515fc9eb28d23fDake Gu
241786ba352397f44022617411936515fc9eb28d23fDake Gu    @Override
242786ba352397f44022617411936515fc9eb28d23fDake Gu    protected Object createEntranceTransition() {
2432452cde3b8d7cbe62f6eb2fbcbcf9a02448d6891Dake Gu        return TransitionHelper.loadTransition(FragmentUtil.getContext(this),
244786ba352397f44022617411936515fc9eb28d23fDake Gu                R.transition.lb_vertical_grid_entrance_transition);
245786ba352397f44022617411936515fc9eb28d23fDake Gu    }
246786ba352397f44022617411936515fc9eb28d23fDake Gu
247786ba352397f44022617411936515fc9eb28d23fDake Gu    @Override
248786ba352397f44022617411936515fc9eb28d23fDake Gu    protected void runEntranceTransition(Object entranceTransition) {
2498403619efebe94666c0615c3fc85080a303acf80Dake Gu        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
250786ba352397f44022617411936515fc9eb28d23fDake Gu    }
251786ba352397f44022617411936515fc9eb28d23fDake Gu
252786ba352397f44022617411936515fc9eb28d23fDake Gu    void setEntranceTransitionState(boolean afterTransition) {
253786ba352397f44022617411936515fc9eb28d23fDake Gu        mGridPresenter.setEntranceTransitionState(mGridViewHolder, afterTransition);
254786ba352397f44022617411936515fc9eb28d23fDake Gu    }
255739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
256