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