BaseRowFragment.java revision 4510b275c55d9a3dae13af38196d3bc6affd3dfc
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.app; 15 16import android.app.Fragment; 17import android.os.Bundle; 18import android.support.v17.leanback.widget.ObjectAdapter; 19import android.support.v17.leanback.widget.PresenterSelector; 20import android.support.v17.leanback.widget.ItemBridgeAdapter; 21import android.support.v17.leanback.widget.VerticalGridView; 22import android.support.v17.leanback.widget.Row; 23import android.support.v17.leanback.widget.ListRow; 24import android.support.v17.leanback.widget.OnChildSelectedListener; 25import android.view.LayoutInflater; 26import android.view.View; 27import android.view.ViewGroup; 28 29/** 30 * An internal base class for a fragment containing a list of rows. 31 */ 32abstract class BaseRowFragment extends Fragment { 33 private ObjectAdapter mAdapter; 34 private VerticalGridView mVerticalGridView; 35 private PresenterSelector mPresenterSelector; 36 private ItemBridgeAdapter mBridgeAdapter; 37 private int mSelectedPosition = -1; 38 protected int mReparentHeaderId; 39 protected boolean mInTransition; 40 41 abstract protected int getLayoutResourceId(); 42 43 private final OnChildSelectedListener mRowSelectedListener = new OnChildSelectedListener() { 44 @Override 45 public void onChildSelected(ViewGroup parent, View view, int position, long id) { 46 onRowSelected(parent, view, position, id); 47 } 48 }; 49 50 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 51 } 52 53 @Override 54 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 55 mVerticalGridView = (VerticalGridView) inflater.inflate(getLayoutResourceId(), container, false); 56 return mVerticalGridView; 57 } 58 59 @Override 60 public void onViewCreated(View view, Bundle savedInstanceState) { 61 if (mBridgeAdapter != null) { 62 mVerticalGridView.setAdapter(mBridgeAdapter); 63 if (mSelectedPosition != -1) { 64 mVerticalGridView.setSelectedPosition(mSelectedPosition); 65 } 66 } 67 mVerticalGridView.setOnChildSelectedListener(mRowSelectedListener); 68 } 69 70 @Override 71 public void onDestroyView() { 72 super.onDestroyView(); 73 mVerticalGridView = null; 74 } 75 76 /** 77 * Set the presenter selector used to create and bind views. 78 */ 79 public final void setPresenterSelector(PresenterSelector presenterSelector) { 80 mPresenterSelector = presenterSelector; 81 updateAdapter(); 82 } 83 84 /** 85 * Get the presenter selector used to create and bind views. 86 */ 87 public final PresenterSelector getPresenterSelector() { 88 return mPresenterSelector; 89 } 90 91 /** 92 * Sets the adapter for the fragment. 93 */ 94 public final void setAdapter(ObjectAdapter rowsAdapter) { 95 mAdapter = rowsAdapter; 96 updateAdapter(); 97 } 98 99 /** 100 * Returns the list of rows. 101 */ 102 public final ObjectAdapter getAdapter() { 103 return mAdapter; 104 } 105 106 /** 107 * Returns the bridge adapter. 108 */ 109 protected final ItemBridgeAdapter getBridgeAdapter() { 110 return mBridgeAdapter; 111 } 112 113 /** 114 * Set the selected item position. 115 */ 116 public void setSelectedPosition(int position) { 117 mSelectedPosition = position; 118 if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) { 119 mVerticalGridView.setSelectedPositionSmooth(position); 120 } 121 } 122 123 final VerticalGridView getVerticalGridView() { 124 return mVerticalGridView; 125 } 126 127 protected void updateAdapter() { 128 mBridgeAdapter = null; 129 130 if (mAdapter != null) { 131 // If presenter selector is null, adapter ps will be used 132 mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector); 133 } 134 if (mVerticalGridView != null) { 135 mVerticalGridView.setAdapter(mBridgeAdapter); 136 if (mBridgeAdapter != null && mSelectedPosition != -1) { 137 mVerticalGridView.setSelectedPosition(mSelectedPosition); 138 } 139 } 140 } 141 142 protected Object getItem(Row row, int position) { 143 if (row instanceof ListRow) { 144 return ((ListRow) row).getAdapter().get(position); 145 } else { 146 return null; 147 } 148 } 149 150 void setReparentHeaderId(int reparentId) { 151 mReparentHeaderId = reparentId; 152 } 153 154 void onTransitionStart() { 155 mInTransition = true; 156 if (mVerticalGridView != null) { 157 mVerticalGridView.setAnimateChildLayout(false); 158 mVerticalGridView.setPruneChild(false); 159 mVerticalGridView.setFocusSearchDisabled(true); 160 } 161 } 162 163 void onTransitionEnd() { 164 if (mVerticalGridView != null) { 165 mVerticalGridView.setAnimateChildLayout(true); 166 mVerticalGridView.setPruneChild(true); 167 mVerticalGridView.setFocusSearchDisabled(false); 168 } 169 mInTransition = false; 170 } 171} 172