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