VerticalGridPresenter.java revision 71fddded48048acfa744ac352166770c91a1c2b1
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 3171fddded48048acfa744ac352166770c91a1c2b1Dake Gu class VerticalGridItemBridgeAdapter extends ItemBridgeAdapter { 3271fddded48048acfa744ac352166770c91a1c2b1Dake Gu @Override 3371fddded48048acfa744ac352166770c91a1c2b1Dake Gu public void onBind(final ItemBridgeAdapter.ViewHolder itemViewHolder) { 3471fddded48048acfa744ac352166770c91a1c2b1Dake Gu // Only when having an OnItemClickListner, we attach the OnClickListener. 3571fddded48048acfa744ac352166770c91a1c2b1Dake Gu if (getOnItemClickedListener() != null || getOnItemViewClickedListener() != null) { 3671fddded48048acfa744ac352166770c91a1c2b1Dake Gu final View itemView = itemViewHolder.mHolder.view; 3771fddded48048acfa744ac352166770c91a1c2b1Dake Gu itemView.setOnClickListener(new View.OnClickListener() { 3871fddded48048acfa744ac352166770c91a1c2b1Dake Gu @Override 3971fddded48048acfa744ac352166770c91a1c2b1Dake Gu public void onClick(View view) { 4071fddded48048acfa744ac352166770c91a1c2b1Dake Gu if (getOnItemClickedListener() != null) { 4171fddded48048acfa744ac352166770c91a1c2b1Dake Gu // Row is always null 4271fddded48048acfa744ac352166770c91a1c2b1Dake Gu getOnItemClickedListener().onItemClicked(itemViewHolder.mItem, 4371fddded48048acfa744ac352166770c91a1c2b1Dake Gu null); 4471fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 4571fddded48048acfa744ac352166770c91a1c2b1Dake Gu if (getOnItemViewClickedListener() != null) { 4671fddded48048acfa744ac352166770c91a1c2b1Dake Gu // Row is always null 4771fddded48048acfa744ac352166770c91a1c2b1Dake Gu getOnItemViewClickedListener().onItemClicked( 4871fddded48048acfa744ac352166770c91a1c2b1Dake Gu itemViewHolder.mHolder, itemViewHolder.mItem, null, null); 4971fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 5071fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 5171fddded48048acfa744ac352166770c91a1c2b1Dake Gu }); 5271fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 5371fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 5471fddded48048acfa744ac352166770c91a1c2b1Dake Gu 5571fddded48048acfa744ac352166770c91a1c2b1Dake Gu @Override 5671fddded48048acfa744ac352166770c91a1c2b1Dake Gu public void onUnbind(ItemBridgeAdapter.ViewHolder viewHolder) { 5771fddded48048acfa744ac352166770c91a1c2b1Dake Gu if (getOnItemClickedListener() != null || getOnItemViewClickedListener() != null) { 5871fddded48048acfa744ac352166770c91a1c2b1Dake Gu viewHolder.mHolder.view.setOnClickListener(null); 5971fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 6071fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 6171fddded48048acfa744ac352166770c91a1c2b1Dake Gu 6271fddded48048acfa744ac352166770c91a1c2b1Dake Gu @Override 6371fddded48048acfa744ac352166770c91a1c2b1Dake Gu public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) { 6471fddded48048acfa744ac352166770c91a1c2b1Dake Gu viewHolder.itemView.setActivated(true); 6571fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 6671fddded48048acfa744ac352166770c91a1c2b1Dake Gu } 6771fddded48048acfa744ac352166770c91a1c2b1Dake Gu 68739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public static class ViewHolder extends Presenter.ViewHolder { 6971fddded48048acfa744ac352166770c91a1c2b1Dake Gu ItemBridgeAdapter mItemBridgeAdapter; 70739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout final VerticalGridView mGridView; 71739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout boolean mInitialized; 72739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 73739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public ViewHolder(VerticalGridView view) { 74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout super(view); 75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridView = view; 76739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public VerticalGridView getGridView() { 79739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return mGridView; 80739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 81739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 82739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 83739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private int mNumColumns = -1; 84739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private int mZoomFactor; 850d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout private boolean mShadowEnabled = true; 86739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private OnItemClickedListener mOnItemClickedListener; 87947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu private OnItemSelectedListener mOnItemSelectedListener; 88947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu private OnItemViewSelectedListener mOnItemViewSelectedListener; 89947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu private OnItemViewClickedListener mOnItemViewClickedListener; 904f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout private boolean mRoundedCornersEnabled = true; 91739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 92739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public VerticalGridPresenter() { 93a37118706af7d79adeb8b3918fb52fad99ece361Dake Gu this(FocusHighlight.ZOOM_FACTOR_LARGE); 94739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 95739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 96739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public VerticalGridPresenter(int zoomFactor) { 97739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mZoomFactor = zoomFactor; 98739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 99739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 100739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 101739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets the number of columns in the vertical grid. 102739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 103739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void setNumberOfColumns(int numColumns) { 104739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (numColumns < 0) { 105739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout throw new IllegalArgumentException("Invalid number of columns"); 106739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 107739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (mNumColumns != numColumns) { 108739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mNumColumns = numColumns; 109739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 111739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 112739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Returns the number of columns in the vertical grid. 114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public int getNumberOfColumns() { 116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return mNumColumns; 117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 1190d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout /** 1200d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * Enable or disable child shadow. 1210d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * This is not only for enable/disable default shadow implementation but also subclass must 1220d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * respect this flag. 1230d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout */ 1240d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout public final void setShadowEnabled(boolean enabled) { 1250d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout mShadowEnabled = enabled; 1260d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 1270d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout 1280d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout /** 1290d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * Returns true if child shadow is enabled. 1300d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * This is not only for enable/disable default shadow implementation but also subclass must 1310d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * respect this flag. 1320d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout */ 1330d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout public final boolean getShadowEnabled() { 1340d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout return mShadowEnabled; 1350d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 1360d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout 1370d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout /** 1380d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * Returns true if opticalBounds is supported (SDK >= 18) so that default shadow 1390d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * is applied to each individual child of {@link VerticalGridView}. 1400d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout * Subclass may return false to disable. 1410d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout */ 1420d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout public boolean isUsingDefaultShadow() { 1430d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout return ShadowOverlayContainer.supportsShadow(); 1440d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 1450d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout 14674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu /** 1474f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Enables or disabled rounded corners on children of this row. 1484f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Supported on Android SDK >= L. 1494f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout */ 1504f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout public final void enableChildRoundedCorners(boolean enable) { 1514f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout mRoundedCornersEnabled = enable; 1524f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout } 1534f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 1544f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout /** 1554f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout * Returns true if rounded corners are enabled for children of this row. 1564f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout */ 1574f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout public final boolean areChildRoundedCornersEnabled() { 1584f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout return mRoundedCornersEnabled; 1594f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout } 1604f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout 1614f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout /** 16274ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * Returns true if SDK >= L, where Z shadow is enabled so that Z order is enabled 16374ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * on each child of vertical grid. If subclass returns false in isUsingDefaultShadow() 16474ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * and does not use Z-shadow on SDK >= L, it should override isUsingZOrder() return false. 16574ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu */ 16674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu public boolean isUsingZOrder() { 16774ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu return ShadowHelper.getInstance().usesZShadow(); 16874ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu } 16974ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu 1700d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout final boolean needsDefaultShadow() { 1710d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout return isUsingDefaultShadow() && getShadowEnabled(); 1720d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 1730d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout 174739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 175739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public final ViewHolder onCreateViewHolder(ViewGroup parent) { 176739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout ViewHolder vh = createGridViewHolder(parent); 177739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.mInitialized = false; 17871fddded48048acfa744ac352166770c91a1c2b1Dake Gu vh.mItemBridgeAdapter = new VerticalGridItemBridgeAdapter(); 179739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout initializeGridViewHolder(vh); 180739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (!vh.mInitialized) { 181739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout throw new RuntimeException("super.initializeGridViewHolder() must be called"); 182739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 183739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return vh; 184739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 185739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 186739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 187739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Subclass may override this to inflate a different layout. 188739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout protected ViewHolder createGridViewHolder(ViewGroup parent) { 190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout View root = LayoutInflater.from(parent.getContext()).inflate( 191cb13a318e577e14461eb008071dddf762847de42Dake Gu R.layout.lb_vertical_grid, parent, false); 192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return new ViewHolder((VerticalGridView) root.findViewById(R.id.browse_grid)); 193739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 194739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 1950d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout private ItemBridgeAdapter.Wrapper mWrapper = new ItemBridgeAdapter.Wrapper() { 1960d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout @Override 1970d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout public View createWrapper(View root) { 1980d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout ShadowOverlayContainer wrapper = new ShadowOverlayContainer(root.getContext()); 1990d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout wrapper.setLayoutParams( 2000d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 20146e7de54775fc37dc51041629c79249e6dae3242Dake Gu wrapper.initialize(needsDefaultShadow(), true, areChildRoundedCornersEnabled()); 2020d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout return wrapper; 2030d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 2040d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout @Override 2050d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout public void wrap(View wrapper, View wrapped) { 2060d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout ((ShadowOverlayContainer) wrapper).wrap(wrapped); 2070d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 2080d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout }; 2090d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout 21074ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu /** 21174ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * Called after a {@link VerticalGridPresenter.ViewHolder} is created. 21274ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * Subclasses may override this method and start by calling 21374ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * super.initializeGridViewHolder(ViewHolder). 21474ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * 21574ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu * @param vh The ViewHolder to initialize for the vertical grid. 21674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu */ 217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout protected void initializeGridViewHolder(ViewHolder vh) { 218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (mNumColumns == -1) { 219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout throw new IllegalStateException("Number of columns must be set"); 220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 221739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (DEBUG) Log.v(TAG, "mNumColumns " + mNumColumns); 222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.getGridView().setNumColumns(mNumColumns); 223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.mInitialized = true; 224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 22546e7de54775fc37dc51041629c79249e6dae3242Dake Gu vh.mItemBridgeAdapter.setWrapper(mWrapper); 2264f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout if (needsDefaultShadow() || areChildRoundedCornersEnabled()) { 2270d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout ShadowOverlayContainer.prepareParentForShadow(vh.getGridView()); 2280d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout ((ViewGroup) vh.view).setClipChildren(false); 2290d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout } 23074ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu vh.getGridView().setFocusDrawingOrderEnabled(!isUsingZOrder()); 23146e7de54775fc37dc51041629c79249e6dae3242Dake Gu FocusHighlightHelper.setupBrowseItemFocusHighlight(vh.mItemBridgeAdapter, 23246e7de54775fc37dc51041629c79249e6dae3242Dake Gu mZoomFactor, true); 233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout final ViewHolder gridViewHolder = vh; 235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.getGridView().setOnChildSelectedListener(new OnChildSelectedListener() { 236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onChildSelected(ViewGroup parent, View view, int position, long id) { 238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout selectChildView(gridViewHolder, view); 239739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 240739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout }); 241739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 242739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 243739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 244739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { 245739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (DEBUG) Log.v(TAG, "onBindViewHolder " + item); 246739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout ViewHolder vh = (ViewHolder) viewHolder; 247739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.mItemBridgeAdapter.setAdapter((ObjectAdapter) item); 248739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.getGridView().setAdapter(vh.mItemBridgeAdapter); 249739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 250739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 251739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 252739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { 253739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (DEBUG) Log.v(TAG, "onUnbindViewHolder"); 254739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout ViewHolder vh = (ViewHolder) viewHolder; 255739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.mItemBridgeAdapter.setAdapter(null); 256739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout vh.getGridView().setAdapter(null); 257739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 258739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 259739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 260739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets the item selected listener. 261739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Since this is a grid the row parameter is always null. 262afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)} 263739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 264739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public final void setOnItemSelectedListener(OnItemSelectedListener listener) { 265739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mOnItemSelectedListener = listener; 266739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 267739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 268739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 269739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Returns the item selected listener. 270afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #getOnItemViewSelectedListener()} 271739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 272739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public final OnItemSelectedListener getOnItemSelectedListener() { 273739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return mOnItemSelectedListener; 274739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 275739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 276739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 277947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Sets the item selected listener. 278947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Since this is a grid the row parameter is always null. 279947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 280947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public final void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) { 281947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mOnItemViewSelectedListener = listener; 282947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 283947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 284947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 285947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Returns the item selected listener. 286947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 287947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public final OnItemViewSelectedListener getOnItemViewSelectedListener() { 288947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu return mOnItemViewSelectedListener; 289947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 290947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 291947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 292739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets the item clicked listener. 293739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * OnItemClickedListener will override {@link View.OnClickListener} that 294739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}. 295739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * So in general, developer should choose one of the listeners but not both. 296afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)} 297739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 298739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public final void setOnItemClickedListener(OnItemClickedListener listener) { 299739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mOnItemClickedListener = listener; 300739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 301739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 302739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 303947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Sets the item clicked listener. 304947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * OnItemViewClickedListener will override {@link View.OnClickListener} that 305947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}. 306947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * So in general, developer should choose one of the listeners but not both. 307947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 308947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public final void setOnItemViewClickedListener(OnItemViewClickedListener listener) { 309947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mOnItemViewClickedListener = listener; 310947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 311947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 312947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 313739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Returns the item clicked listener. 314afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #getOnItemViewClickedListener()} 315739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 316739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public final OnItemClickedListener getOnItemClickedListener() { 317739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return mOnItemClickedListener; 318739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 319739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 320947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 321947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Returns the item clicked listener. 322947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 323947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public final OnItemViewClickedListener getOnItemViewClickedListener() { 324947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu return mOnItemViewClickedListener; 325947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 326947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 327739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private void selectChildView(ViewHolder vh, View view) { 328739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (getOnItemSelectedListener() != null) { 329739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout ItemBridgeAdapter.ViewHolder ibh = (view == null) ? null : 330947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu (ItemBridgeAdapter.ViewHolder) vh.getGridView().getChildViewHolder(view); 331947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (ibh == null) { 332947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu getOnItemSelectedListener().onItemSelected(null, null); 333947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } else { 334947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu getOnItemSelectedListener().onItemSelected(ibh.mItem, null); 335947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 336739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 337947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (getOnItemViewSelectedListener() != null) { 338947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu ItemBridgeAdapter.ViewHolder ibh = (view == null) ? null : 339947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu (ItemBridgeAdapter.ViewHolder) vh.getGridView().getChildViewHolder(view); 340947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (ibh == null) { 341947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu getOnItemViewSelectedListener().onItemSelected(null, null, null, null); 342947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } else { 343947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu getOnItemViewSelectedListener().onItemSelected(ibh.mHolder, ibh.mItem, null, null); 344947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 345947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 346947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 347739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout} 348