HeadersFragment.java revision 2f97594742886d045ca1ce409ebc6e6e780452f6
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 */ 14 15package android.support.v17.leanback.app; 16 17import android.os.Bundle; 18import android.support.v17.leanback.R; 19import android.support.v17.leanback.widget.FocusHighlightHelper; 20import android.support.v17.leanback.widget.ItemBridgeAdapter; 21import android.support.v17.leanback.widget.Presenter; 22import android.support.v17.leanback.widget.PresenterSelector; 23import android.support.v17.leanback.widget.OnItemSelectedListener; 24import android.support.v17.leanback.widget.Row; 25import android.support.v17.leanback.widget.RowHeaderPresenter; 26import android.support.v17.leanback.widget.SinglePresenterSelector; 27import android.support.v17.leanback.widget.VerticalGridView; 28import android.support.v7.widget.RecyclerView; 29import android.view.LayoutInflater; 30import android.view.View; 31import android.view.ViewGroup; 32import android.view.View.OnLayoutChangeListener; 33 34import java.util.ArrayList; 35import java.util.List; 36 37/** 38 * An internal fragment containing a list of row headers. 39 */ 40public class HeadersFragment extends BaseRowFragment { 41 42 interface OnHeaderClickedListener { 43 void onHeaderClicked(); 44 } 45 46 private OnItemSelectedListener mOnItemSelectedListener; 47 private OnHeaderClickedListener mOnHeaderClickedListener; 48 private boolean mShow = true; 49 50 private static final PresenterSelector sHeaderPresenter = new SinglePresenterSelector( 51 new RowHeaderPresenter()); 52 53 public HeadersFragment() { 54 setPresenterSelector(sHeaderPresenter); 55 } 56 57 public void setOnHeaderClickedListener(OnHeaderClickedListener listener) { 58 mOnHeaderClickedListener = listener; 59 } 60 61 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 62 mOnItemSelectedListener = listener; 63 } 64 65 @Override 66 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 67 if (mOnItemSelectedListener != null) { 68 if (position >= 0) { 69 Row row = (Row) getAdapter().get(position); 70 mOnItemSelectedListener.onItemSelected(null, row); 71 } 72 } 73 } 74 75 private final ItemBridgeAdapter.AdapterListener mAdapterListener = 76 new ItemBridgeAdapter.AdapterListener() { 77 @Override 78 public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) { 79 View headerView = viewHolder.getViewHolder().view; 80 headerView.setOnClickListener(new View.OnClickListener() { 81 @Override 82 public void onClick(View v) { 83 if (mOnHeaderClickedListener != null) { 84 mOnHeaderClickedListener.onHeaderClicked(); 85 } 86 } 87 }); 88 headerView.setFocusable(true); 89 headerView.setFocusableInTouchMode(true); 90 headerView.addOnLayoutChangeListener(sLayoutChangeListener); 91 } 92 93 @Override 94 public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) { 95 View headerView = viewHolder.getViewHolder().view; 96 if (mInTransition) { 97 updateHeaderViewForTransition(headerView, viewHolder.getPosition()); 98 } 99 } 100 }; 101 102 /** 103 * Preparing headerView for transition. 104 */ 105 private void updateHeaderViewForTransition(View headerView, Integer position) { 106 final VerticalGridView listView = getVerticalGridView(); 107 if (position == listView.getSelectedPosition()) { 108 headerView.setId(mReparentHeaderId); 109 } else { 110 headerView.setId(View.NO_ID); 111 } 112 headerView.setTag(R.id.lb_header_transition_position, position); 113 } 114 115 /** 116 * Preparing all headerViews for transition. 117 */ 118 private void updateHeaderViewsForTransition() { 119 final VerticalGridView listView = getVerticalGridView(); 120 if (listView == null) { 121 return; 122 } 123 final int count = listView.getChildCount(); 124 for (int i = 0; i < count; i++) { 125 View child = listView.getChildAt(i); 126 updateHeaderViewForTransition(child, 127 listView.getChildViewHolder(child).getPosition()); 128 } 129 } 130 131 @Override 132 void onTransitionStart() { 133 super.onTransitionStart(); 134 updateHeaderViewsForTransition(); 135 } 136 137 private static OnLayoutChangeListener sLayoutChangeListener = new OnLayoutChangeListener() { 138 @Override 139 public void onLayoutChange(View v, int left, int top, int right, int bottom, 140 int oldLeft, int oldTop, int oldRight, int oldBottom) { 141 v.setPivotX(0); 142 v.setPivotY(v.getMeasuredHeight() / 2); 143 } 144 }; 145 146 @Override 147 protected int getLayoutResourceId() { 148 return R.layout.lb_headers_fragment; 149 } 150 151 @Override 152 public void onViewCreated(View view, Bundle savedInstanceState) { 153 super.onViewCreated(view, savedInstanceState); 154 if (getBridgeAdapter() != null && getVerticalGridView() != null) { 155 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 156 } 157 } 158 159 void setHeadersVisiblity(boolean show) { 160 mShow = show; 161 final VerticalGridView listView = getVerticalGridView(); 162 if (listView != null) { 163 listView.setLayoutEnabled(show); 164 } 165 } 166 167 @Override 168 protected void updateAdapter() { 169 super.updateAdapter(); 170 ItemBridgeAdapter adapter = getBridgeAdapter(); 171 if (adapter != null) { 172 adapter.setAdapterListener(mAdapterListener); 173 } 174 if (adapter != null && getVerticalGridView() != null) { 175 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 176 } 177 } 178} 179