HeadersFragment.java revision bd80644186ff8622c565f067dc3a4136a4dc0586
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; 32 33import java.util.List; 34 35/** 36 * An internal fragment containing a list of row headers. 37 */ 38public class HeadersFragment extends BaseRowFragment { 39 40 interface OnHeaderClickedListener { 41 void onHeaderClicked(); 42 } 43 44 private OnItemSelectedListener mOnItemSelectedListener; 45 private OnHeaderClickedListener mOnHeaderClickedListener; 46 private boolean mShow = true; 47 48 private static final PresenterSelector sHeaderPresenter = new SinglePresenterSelector( 49 new RowHeaderPresenter()); 50 51 public HeadersFragment() { 52 setPresenterSelector(sHeaderPresenter); 53 } 54 55 public void setOnHeaderClickedListener(OnHeaderClickedListener listener) { 56 mOnHeaderClickedListener = listener; 57 } 58 59 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 60 mOnItemSelectedListener = listener; 61 } 62 63 @Override 64 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 65 if (mOnItemSelectedListener != null) { 66 if (position >= 0) { 67 Row row = (Row) getAdapter().get(position); 68 mOnItemSelectedListener.onItemSelected(null, row); 69 } 70 } 71 } 72 73 private final ItemBridgeAdapter.AdapterListener mAdapterListener = 74 new ItemBridgeAdapter.AdapterListener() { 75 @Override 76 public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) { 77 View headerView = viewHolder.getViewHolder().view; 78 headerView.setOnClickListener(new View.OnClickListener() { 79 @Override 80 public void onClick(View v) { 81 if (mOnHeaderClickedListener != null) { 82 mOnHeaderClickedListener.onHeaderClicked(); 83 } 84 } 85 }); 86 headerView.setFocusable(true); 87 headerView.setFocusableInTouchMode(true); 88 } 89 90 @Override 91 public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) { 92 View headerView = viewHolder.getViewHolder().view; 93 headerView.setVisibility(mShow ? View.VISIBLE : View.INVISIBLE); 94 } 95 }; 96 97 @Override 98 protected int getLayoutResourceId() { 99 return R.layout.lb_headers_fragment; 100 } 101 102 @Override 103 public void onViewCreated(View view, Bundle savedInstanceState) { 104 super.onViewCreated(view, savedInstanceState); 105 if (getBridgeAdapter() != null && getVerticalGridView() != null) { 106 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 107 } 108 } 109 110 void getHeaderViews(List<View> headers, List<Integer> positions) { 111 final VerticalGridView listView = getVerticalGridView(); 112 if (listView == null) { 113 return; 114 } 115 final int count = listView.getChildCount(); 116 for (int i = 0; i < count; i++) { 117 View child = listView.getChildAt(i); 118 headers.add(child); 119 positions.add(listView.getChildViewHolder(child).getPosition()); 120 } 121 } 122 123 void setHeadersVisiblity(boolean show) { 124 mShow = show; 125 final VerticalGridView listView = getVerticalGridView(); 126 if (listView == null) { 127 return; 128 } 129 final int count = listView.getChildCount(); 130 final int visibility = mShow ? View.VISIBLE : View.INVISIBLE; 131 132 // we should set visibility of selected view first so that it can 133 // regain the focus from parent (which is FOCUS_AFTER_DESCENDANT) 134 final int selectedPosition = listView.getSelectedPosition(); 135 if (selectedPosition >= 0) { 136 RecyclerView.ViewHolder vh = listView.findViewHolderForPosition(selectedPosition); 137 if (vh != null) { 138 vh.itemView.setVisibility(visibility); 139 } 140 } 141 for (int i = 0; i < count; i++) { 142 View child = listView.getChildAt(i); 143 if (listView.getChildPosition(child) != selectedPosition) { 144 child.setVisibility(visibility); 145 } 146 } 147 } 148 149 @Override 150 protected void updateAdapter() { 151 super.updateAdapter(); 152 ItemBridgeAdapter adapter = getBridgeAdapter(); 153 if (adapter != null) { 154 adapter.setAdapterListener(mAdapterListener); 155 } 156 if (adapter != null && getVerticalGridView() != null) { 157 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 158 } 159 } 160} 161