VerticalGridPresenter.java revision 0d734cb6671b314f84cb4911cd37631177d07fba
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.widget;
15739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
16739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.R;
17739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
18739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
19739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
200d734cb6671b314f84cb4911cd37631177d07fbaCraig Stoutimport android.view.ViewGroup.LayoutParams;
21739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.util.Log;
22739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
23739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
24739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * A presenter that renders objects in a vertical grid.
25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
26739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridPresenter extends Presenter {
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final String TAG = "GridPresenter";
29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final boolean DEBUG = false;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public static class ViewHolder extends Presenter.ViewHolder {
32739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        final ItemBridgeAdapter mItemBridgeAdapter = new ItemBridgeAdapter();
33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        final VerticalGridView mGridView;
34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        boolean mInitialized;
35739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
36739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public ViewHolder(VerticalGridView view) {
37739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            super(view);
38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridView = view;
39739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
40739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
41739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public VerticalGridView getGridView() {
42739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mGridView;
43739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
44739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
46739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mNumColumns = -1;
47739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mZoomFactor;
480d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    private boolean mShadowEnabled = true;
49739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemSelectedListener mOnItemSelectedListener;
50739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemClickedListener mOnItemClickedListener;
51739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
52739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter() {
53739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        this(FocusHighlight.ZOOM_FACTOR_MEDIUM);
54739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
55739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
56739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter(int zoomFactor) {
57739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mZoomFactor = zoomFactor;
58739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
59739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
60739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
61739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the number of columns in the vertical grid.
62739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
63739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setNumberOfColumns(int numColumns) {
64739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (numColumns < 0) {
65739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Invalid number of columns");
66739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
67739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mNumColumns != numColumns) {
68739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mNumColumns = numColumns;
69739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
70739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
71739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
72739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
73739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the number of columns in the vertical grid.
74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public int getNumberOfColumns() {
76739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mNumColumns;
77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
790d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
800d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Enable or disable child shadow.
810d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * This is not only for enable/disable default shadow implementation but also subclass must
820d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * respect this flag.
830d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
840d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public final void setShadowEnabled(boolean enabled) {
850d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        mShadowEnabled = enabled;
860d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
870d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
880d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
890d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Returns true if child shadow is enabled.
900d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * This is not only for enable/disable default shadow implementation but also subclass must
910d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * respect this flag.
920d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
930d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public final boolean getShadowEnabled() {
940d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return mShadowEnabled;
950d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
960d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
970d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
980d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Returns true if opticalBounds is supported (SDK >= 18) so that default shadow
990d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * is applied to each individual child of {@link VerticalGridView}.
1000d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Subclass may return false to disable.
1010d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
1020d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public boolean isUsingDefaultShadow() {
1030d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return ShadowOverlayContainer.supportsShadow();
1040d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1050d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
1060d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    final boolean needsDefaultShadow() {
1070d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return isUsingDefaultShadow() && getShadowEnabled();
1080d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1090d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
111739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final ViewHolder onCreateViewHolder(ViewGroup parent) {
112739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = createGridViewHolder(parent);
113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mInitialized = false;
114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        initializeGridViewHolder(vh);
115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (!vh.mInitialized) {
116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new RuntimeException("super.initializeGridViewHolder() must be called");
117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return vh;
119739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
120739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
121739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
122739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Subclass may override this to inflate a different layout.
123739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
124739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    protected ViewHolder createGridViewHolder(ViewGroup parent) {
125739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        View root = LayoutInflater.from(parent.getContext()).inflate(
126739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                R.layout.lb_browse_grid, parent, false);
127739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return new ViewHolder((VerticalGridView) root.findViewById(R.id.browse_grid));
128739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
129739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
1300d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    private ItemBridgeAdapter.Wrapper mWrapper = new ItemBridgeAdapter.Wrapper() {
1310d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        @Override
1320d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        public View createWrapper(View root) {
1330d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ShadowOverlayContainer wrapper = new ShadowOverlayContainer(root.getContext());
1340d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            wrapper.setLayoutParams(
1350d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
1360d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            wrapper.initialize(needsDefaultShadow(), false);
1370d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            return wrapper;
1380d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
1390d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        @Override
1400d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        public void wrap(View wrapper, View wrapped) {
1410d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ((ShadowOverlayContainer) wrapper).wrap(wrapped);
1420d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
1430d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    };
1440d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
145739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    protected void initializeGridViewHolder(ViewHolder vh) {
146739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mNumColumns == -1) {
147739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalStateException("Number of columns must be set");
148739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
149739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "mNumColumns " + mNumColumns);
150739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setNumColumns(mNumColumns);
151739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mInitialized = true;
152739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
1530d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        if (needsDefaultShadow()) {
1540d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            vh.mItemBridgeAdapter.setWrapper(mWrapper);
1550d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ShadowOverlayContainer.prepareParentForShadow(vh.getGridView());
1560d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ((ViewGroup) vh.view).setClipChildren(false);
1570d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
158739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        FocusHighlightHelper.setupBrowseItemFocusHighlight(vh.mItemBridgeAdapter, mZoomFactor);
159739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
160739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        final ViewHolder gridViewHolder = vh;
161739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setOnChildSelectedListener(new OnChildSelectedListener() {
162739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            @Override
163739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
164739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                selectChildView(gridViewHolder, view);
165739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
166739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        });
167739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
168739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mItemBridgeAdapter.setAdapterListener(new ItemBridgeAdapter.AdapterListener() {
169739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            @Override
170739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            public void onCreate(final ItemBridgeAdapter.ViewHolder itemViewHolder) {
171739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                // Only when having an OnItemClickListner, we attach the OnClickListener.
172739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                if (getOnItemClickedListener() != null) {
173739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                    final View itemView = itemViewHolder.getViewHolder().view;
174739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                    itemView.setOnClickListener(new View.OnClickListener() {
175739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                        @Override
176739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                        public void onClick(View view) {
177739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                            if (getOnItemClickedListener() != null) {
178739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                                // Row is always null
179739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                                getOnItemClickedListener().onItemClicked(itemViewHolder.mItem, null);
180739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                            }
181739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                        }
182739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                    });
183739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                }
184739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
185739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        });
186739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
187739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
188739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "onBindViewHolder " + item);
191739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = (ViewHolder) viewHolder;
192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mItemBridgeAdapter.setAdapter((ObjectAdapter) item);
193739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setAdapter(vh.mItemBridgeAdapter);
194739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
195739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
196739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
197739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
198739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "onUnbindViewHolder");
199739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = (ViewHolder) viewHolder;
200739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mItemBridgeAdapter.setAdapter(null);
201739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setAdapter(null);
202739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
203739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
204739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
205739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the item selected listener.
206739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Since this is a grid the row parameter is always null.
207739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
208739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final void setOnItemSelectedListener(OnItemSelectedListener listener) {
209739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemSelectedListener = listener;
210739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
211739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
212739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
213739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item selected listener.
214739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
215739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final OnItemSelectedListener getOnItemSelectedListener() {
216739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemSelectedListener;
217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the item clicked listener.
221739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * OnItemClickedListener will override {@link View.OnClickListener} that
222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * So in general, developer should choose one of the listeners but not both.
224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
225739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final void setOnItemClickedListener(OnItemClickedListener listener) {
226739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemClickedListener = listener;
227739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
228739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
229739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
230739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item clicked listener.
231739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
232739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final OnItemClickedListener getOnItemClickedListener() {
233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemClickedListener;
234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void selectChildView(ViewHolder vh, View view) {
237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (getOnItemSelectedListener() != null) {
238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            ItemBridgeAdapter.ViewHolder ibh = (view == null) ? null :
239739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                (ItemBridgeAdapter.ViewHolder) vh.getGridView().getChildViewHolder(view);
240739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
241739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            getOnItemSelectedListener().onItemSelected(ibh == null ? null : ibh.mItem, null);
242739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
243739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    };
244739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
245