BaseRowFragment.java revision 4510b275c55d9a3dae13af38196d3bc6affd3dfc
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    protected int mReparentHeaderId;
39    protected boolean mInTransition;
40
41    abstract protected int getLayoutResourceId();
42
43    private final OnChildSelectedListener mRowSelectedListener = new OnChildSelectedListener() {
44        @Override
45        public void onChildSelected(ViewGroup parent, View view, int position, long id) {
46            onRowSelected(parent, view, position, id);
47        }
48    };
49
50    protected void onRowSelected(ViewGroup parent, View view, int position, long id) {
51    }
52
53    @Override
54    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
55        mVerticalGridView = (VerticalGridView) inflater.inflate(getLayoutResourceId(), container, false);
56        return mVerticalGridView;
57    }
58
59    @Override
60    public void onViewCreated(View view, Bundle savedInstanceState) {
61        if (mBridgeAdapter != null) {
62            mVerticalGridView.setAdapter(mBridgeAdapter);
63            if (mSelectedPosition != -1) {
64                mVerticalGridView.setSelectedPosition(mSelectedPosition);
65            }
66        }
67        mVerticalGridView.setOnChildSelectedListener(mRowSelectedListener);
68    }
69
70    @Override
71    public void onDestroyView() {
72        super.onDestroyView();
73        mVerticalGridView = null;
74    }
75
76    /**
77     * Set the presenter selector used to create and bind views.
78     */
79    public final void setPresenterSelector(PresenterSelector presenterSelector) {
80        mPresenterSelector = presenterSelector;
81        updateAdapter();
82    }
83
84    /**
85     * Get the presenter selector used to create and bind views.
86     */
87    public final PresenterSelector getPresenterSelector() {
88        return mPresenterSelector;
89    }
90
91    /**
92     * Sets the adapter for the fragment.
93     */
94    public final void setAdapter(ObjectAdapter rowsAdapter) {
95        mAdapter = rowsAdapter;
96        updateAdapter();
97    }
98
99    /**
100     * Returns the list of rows.
101     */
102    public final ObjectAdapter getAdapter() {
103        return mAdapter;
104    }
105
106    /**
107     * Returns the bridge adapter.
108     */
109    protected final ItemBridgeAdapter getBridgeAdapter() {
110        return mBridgeAdapter;
111    }
112
113    /**
114     * Set the selected item position.
115     */
116    public void setSelectedPosition(int position) {
117        mSelectedPosition = position;
118        if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) {
119            mVerticalGridView.setSelectedPositionSmooth(position);
120        }
121    }
122
123    final VerticalGridView getVerticalGridView() {
124        return mVerticalGridView;
125    }
126
127    protected void updateAdapter() {
128        mBridgeAdapter = null;
129
130        if (mAdapter != null) {
131            // If presenter selector is null, adapter ps will be used
132            mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector);
133        }
134        if (mVerticalGridView != null) {
135            mVerticalGridView.setAdapter(mBridgeAdapter);
136            if (mBridgeAdapter != null && mSelectedPosition != -1) {
137                mVerticalGridView.setSelectedPosition(mSelectedPosition);
138            }
139        }
140    }
141
142    protected Object getItem(Row row, int position) {
143        if (row instanceof ListRow) {
144            return ((ListRow) row).getAdapter().get(position);
145        } else {
146            return null;
147        }
148    }
149
150    void setReparentHeaderId(int reparentId) {
151        mReparentHeaderId = reparentId;
152    }
153
154    void onTransitionStart() {
155        mInTransition = true;
156        if (mVerticalGridView != null) {
157            mVerticalGridView.setAnimateChildLayout(false);
158            mVerticalGridView.setPruneChild(false);
159            mVerticalGridView.setFocusSearchDisabled(true);
160        }
161    }
162
163    void onTransitionEnd() {
164        if (mVerticalGridView != null) {
165            mVerticalGridView.setAnimateChildLayout(true);
166            mVerticalGridView.setPruneChild(true);
167            mVerticalGridView.setFocusSearchDisabled(false);
168        }
169        mInTransition = false;
170    }
171}
172