BaseRowFragment.java revision a8a3b898da49324e83ea32c3f08776a481312166
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        mVerticalGridView = (VerticalGridView) inflater.inflate(getLayoutResourceId(), container, false);
54        return mVerticalGridView;
55    }
56
57    @Override
58    public void onViewCreated(View view, Bundle savedInstanceState) {
59        if (mBridgeAdapter != null) {
60            mVerticalGridView.setAdapter(mBridgeAdapter);
61            if (mSelectedPosition != -1) {
62                mVerticalGridView.setSelectedPosition(mSelectedPosition);
63            }
64        }
65        mVerticalGridView.setOnChildSelectedListener(mRowSelectedListener);
66    }
67
68    @Override
69    public void onDestroyView() {
70        super.onDestroyView();
71        mVerticalGridView = null;
72    }
73
74    /**
75     * Set the presenter selector used to create and bind views.
76     */
77    public final void setPresenterSelector(PresenterSelector presenterSelector) {
78        mPresenterSelector = presenterSelector;
79        updateAdapter();
80    }
81
82    /**
83     * Get the presenter selector used to create and bind views.
84     */
85    public final PresenterSelector getPresenterSelector() {
86        return mPresenterSelector;
87    }
88
89    /**
90     * Sets the adapter for the fragment.
91     */
92    public final void setAdapter(ObjectAdapter rowsAdapter) {
93        mAdapter = rowsAdapter;
94        updateAdapter();
95    }
96
97    /**
98     * Returns the list of rows.
99     */
100    public final ObjectAdapter getAdapter() {
101        return mAdapter;
102    }
103
104    /**
105     * Returns the bridge adapter.
106     */
107    protected final ItemBridgeAdapter getBridgeAdapter() {
108        return mBridgeAdapter;
109    }
110
111    /**
112     * Set the selected item position.
113     */
114    public void setSelectedPosition(int position) {
115        mSelectedPosition = position;
116        if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) {
117            mVerticalGridView.setSelectedPositionSmooth(position);
118        }
119    }
120
121    final VerticalGridView getVerticalGridView() {
122        return mVerticalGridView;
123    }
124
125    protected void updateAdapter() {
126        mBridgeAdapter = null;
127
128        if (mAdapter != null) {
129            // If presenter selector is null, adapter ps will be used
130            mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector);
131        }
132        if (mVerticalGridView != null) {
133            mVerticalGridView.setAdapter(mBridgeAdapter);
134            if (mBridgeAdapter != null && mSelectedPosition != -1) {
135                mVerticalGridView.setSelectedPosition(mSelectedPosition);
136            }
137        }
138    }
139
140    protected Object getItem(Row row, int position) {
141        if (row instanceof ListRow) {
142            return ((ListRow) row).getAdapter().get(position);
143        } else {
144            return null;
145        }
146    }
147}
148