BaseRowFragment.java revision 9240e796bc63422c28f2707840bd99c48573279b
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 39 abstract protected int getLayoutResourceId(); 40 41 private final OnChildSelectedListener mRowSelectedListener = new OnChildSelectedListener() { 42 @Override 43 public void onChildSelected(ViewGroup parent, View view, int position, long id) { 44 onRowSelected(parent, view, position, id); 45 } 46 }; 47 48 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 49 } 50 51 @Override 52 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 53 ViewGroup view = (ViewGroup) inflater.inflate(getLayoutResourceId(), container, false); 54 mVerticalGridView = (VerticalGridView) view.getChildAt(0); 55 return view; 56 } 57 58 void detachGridView() { 59 if (mVerticalGridView == null) { 60 return; 61 } 62 ViewGroup viewGroup = (ViewGroup) getView(); 63 if (viewGroup.indexOfChild(mVerticalGridView) >= 0) { 64 viewGroup.removeView(mVerticalGridView); 65 } 66 } 67 68 void attachGridView() { 69 if (mVerticalGridView == null) { 70 return; 71 } 72 ViewGroup viewGroup = (ViewGroup) getView(); 73 if (viewGroup.indexOfChild(mVerticalGridView) < 0) { 74 if (mVerticalGridView.getParent() instanceof ViewGroup) { 75 ((ViewGroup) mVerticalGridView.getParent()).removeView(mVerticalGridView); 76 } 77 viewGroup.addView(mVerticalGridView); 78 } 79 } 80 81 @Override 82 public void onViewCreated(View view, Bundle savedInstanceState) { 83 if (mBridgeAdapter != null) { 84 mVerticalGridView.setAdapter(mBridgeAdapter); 85 if (mSelectedPosition != -1) { 86 mVerticalGridView.setSelectedPosition(mSelectedPosition); 87 } 88 } 89 mVerticalGridView.setOnChildSelectedListener(mRowSelectedListener); 90 } 91 92 @Override 93 public void onDestroyView() { 94 super.onDestroyView(); 95 mVerticalGridView = null; 96 } 97 98 /** 99 * Set the presenter selector used to create and bind views. 100 */ 101 public final void setPresenterSelector(PresenterSelector presenterSelector) { 102 mPresenterSelector = presenterSelector; 103 updateAdapter(); 104 } 105 106 /** 107 * Get the presenter selector used to create and bind views. 108 */ 109 public final PresenterSelector getPresenterSelector() { 110 return mPresenterSelector; 111 } 112 113 /** 114 * Sets the adapter for the fragment. 115 */ 116 public final void setAdapter(ObjectAdapter rowsAdapter) { 117 mAdapter = rowsAdapter; 118 updateAdapter(); 119 } 120 121 /** 122 * Returns the list of rows. 123 */ 124 public final ObjectAdapter getAdapter() { 125 return mAdapter; 126 } 127 128 /** 129 * Returns the bridge adapter. 130 */ 131 protected final ItemBridgeAdapter getBridgeAdapter() { 132 return mBridgeAdapter; 133 } 134 135 /** 136 * Set the selected item position. 137 */ 138 public void setSelectedPosition(int position) { 139 mSelectedPosition = position; 140 if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) { 141 mVerticalGridView.setSelectedPositionSmooth(position); 142 } 143 } 144 145 final VerticalGridView getVerticalGridView() { 146 return mVerticalGridView; 147 } 148 149 protected void updateAdapter() { 150 mBridgeAdapter = null; 151 152 if (mAdapter != null) { 153 // If presenter selector is null, adapter ps will be used 154 mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector); 155 } 156 if (mVerticalGridView != null) { 157 mVerticalGridView.setAdapter(mBridgeAdapter); 158 if (mBridgeAdapter != null && mSelectedPosition != -1) { 159 mVerticalGridView.setSelectedPosition(mSelectedPosition); 160 } 161 } 162 } 163 164 protected Object getItem(Row row, int position) { 165 if (row instanceof ListRow) { 166 return ((ListRow) row).getAdapter().get(position); 167 } else { 168 return null; 169 } 170 } 171} 172