1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.recyclerview;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
20*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.app.Fragment;
21*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.widget.GridLayoutManager;
22*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.widget.LinearLayoutManager;
23*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.widget.RecyclerView;
24*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
25*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
26*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
27*90c8c64dSAndroid Build Coastguard Worker import android.widget.RadioButton;
28*90c8c64dSAndroid Build Coastguard Worker 
29*90c8c64dSAndroid Build Coastguard Worker /**
30*90c8c64dSAndroid Build Coastguard Worker  * Demonstrates the use of {@link RecyclerView} with a {@link LinearLayoutManager} and a
31*90c8c64dSAndroid Build Coastguard Worker  * {@link GridLayoutManager}.
32*90c8c64dSAndroid Build Coastguard Worker  */
33*90c8c64dSAndroid Build Coastguard Worker public class RecyclerViewFragment extends Fragment {
34*90c8c64dSAndroid Build Coastguard Worker 
35*90c8c64dSAndroid Build Coastguard Worker     private static final String TAG = "RecyclerViewFragment";
36*90c8c64dSAndroid Build Coastguard Worker     private static final String KEY_LAYOUT_MANAGER = "layoutManager";
37*90c8c64dSAndroid Build Coastguard Worker     private static final int SPAN_COUNT = 2;
38*90c8c64dSAndroid Build Coastguard Worker     private static final int DATASET_COUNT = 60;
39*90c8c64dSAndroid Build Coastguard Worker 
40*90c8c64dSAndroid Build Coastguard Worker     private enum LayoutManagerType {
41*90c8c64dSAndroid Build Coastguard Worker         GRID_LAYOUT_MANAGER,
42*90c8c64dSAndroid Build Coastguard Worker         LINEAR_LAYOUT_MANAGER
43*90c8c64dSAndroid Build Coastguard Worker     }
44*90c8c64dSAndroid Build Coastguard Worker 
45*90c8c64dSAndroid Build Coastguard Worker     protected LayoutManagerType mCurrentLayoutManagerType;
46*90c8c64dSAndroid Build Coastguard Worker 
47*90c8c64dSAndroid Build Coastguard Worker     protected RadioButton mLinearLayoutRadioButton;
48*90c8c64dSAndroid Build Coastguard Worker     protected RadioButton mGridLayoutRadioButton;
49*90c8c64dSAndroid Build Coastguard Worker 
50*90c8c64dSAndroid Build Coastguard Worker     protected RecyclerView mRecyclerView;
51*90c8c64dSAndroid Build Coastguard Worker     protected CustomAdapter mAdapter;
52*90c8c64dSAndroid Build Coastguard Worker     protected RecyclerView.LayoutManager mLayoutManager;
53*90c8c64dSAndroid Build Coastguard Worker     protected String[] mDataset;
54*90c8c64dSAndroid Build Coastguard Worker 
55*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)56*90c8c64dSAndroid Build Coastguard Worker     public void onCreate(Bundle savedInstanceState) {
57*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
58*90c8c64dSAndroid Build Coastguard Worker 
59*90c8c64dSAndroid Build Coastguard Worker         // Initialize dataset, this data would usually come from a local content provider or
60*90c8c64dSAndroid Build Coastguard Worker         // remote server.
61*90c8c64dSAndroid Build Coastguard Worker         initDataset();
62*90c8c64dSAndroid Build Coastguard Worker     }
63*90c8c64dSAndroid Build Coastguard Worker 
64*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)65*90c8c64dSAndroid Build Coastguard Worker     public View onCreateView(LayoutInflater inflater, ViewGroup container,
66*90c8c64dSAndroid Build Coastguard Worker             Bundle savedInstanceState) {
67*90c8c64dSAndroid Build Coastguard Worker         View rootView = inflater.inflate(R.layout.recycler_view_frag, container, false);
68*90c8c64dSAndroid Build Coastguard Worker         rootView.setTag(TAG);
69*90c8c64dSAndroid Build Coastguard Worker 
70*90c8c64dSAndroid Build Coastguard Worker         // BEGIN_INCLUDE(initializeRecyclerView)
71*90c8c64dSAndroid Build Coastguard Worker         mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
72*90c8c64dSAndroid Build Coastguard Worker 
73*90c8c64dSAndroid Build Coastguard Worker         // LinearLayoutManager is used here, this will layout the elements in a similar fashion
74*90c8c64dSAndroid Build Coastguard Worker         // to the way ListView would layout elements. The RecyclerView.LayoutManager defines how
75*90c8c64dSAndroid Build Coastguard Worker         // elements are laid out.
76*90c8c64dSAndroid Build Coastguard Worker         mLayoutManager = new LinearLayoutManager(getActivity());
77*90c8c64dSAndroid Build Coastguard Worker 
78*90c8c64dSAndroid Build Coastguard Worker         mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
79*90c8c64dSAndroid Build Coastguard Worker 
80*90c8c64dSAndroid Build Coastguard Worker         if (savedInstanceState != null) {
81*90c8c64dSAndroid Build Coastguard Worker             // Restore saved layout manager type.
82*90c8c64dSAndroid Build Coastguard Worker             mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
83*90c8c64dSAndroid Build Coastguard Worker                     .getSerializable(KEY_LAYOUT_MANAGER);
84*90c8c64dSAndroid Build Coastguard Worker         }
85*90c8c64dSAndroid Build Coastguard Worker         setRecyclerViewLayoutManager(mCurrentLayoutManagerType);
86*90c8c64dSAndroid Build Coastguard Worker 
87*90c8c64dSAndroid Build Coastguard Worker         mAdapter = new CustomAdapter(mDataset);
88*90c8c64dSAndroid Build Coastguard Worker         // Set CustomAdapter as the adapter for RecyclerView.
89*90c8c64dSAndroid Build Coastguard Worker         mRecyclerView.setAdapter(mAdapter);
90*90c8c64dSAndroid Build Coastguard Worker         // END_INCLUDE(initializeRecyclerView)
91*90c8c64dSAndroid Build Coastguard Worker 
92*90c8c64dSAndroid Build Coastguard Worker         mLinearLayoutRadioButton = (RadioButton) rootView.findViewById(R.id.linear_layout_rb);
93*90c8c64dSAndroid Build Coastguard Worker         mLinearLayoutRadioButton.setOnClickListener(new View.OnClickListener() {
94*90c8c64dSAndroid Build Coastguard Worker             @Override
95*90c8c64dSAndroid Build Coastguard Worker             public void onClick(View v) {
96*90c8c64dSAndroid Build Coastguard Worker                 setRecyclerViewLayoutManager(LayoutManagerType.LINEAR_LAYOUT_MANAGER);
97*90c8c64dSAndroid Build Coastguard Worker             }
98*90c8c64dSAndroid Build Coastguard Worker         });
99*90c8c64dSAndroid Build Coastguard Worker 
100*90c8c64dSAndroid Build Coastguard Worker         mGridLayoutRadioButton = (RadioButton) rootView.findViewById(R.id.grid_layout_rb);
101*90c8c64dSAndroid Build Coastguard Worker         mGridLayoutRadioButton.setOnClickListener(new View.OnClickListener() {
102*90c8c64dSAndroid Build Coastguard Worker             @Override
103*90c8c64dSAndroid Build Coastguard Worker             public void onClick(View v) {
104*90c8c64dSAndroid Build Coastguard Worker                 setRecyclerViewLayoutManager(LayoutManagerType.GRID_LAYOUT_MANAGER);
105*90c8c64dSAndroid Build Coastguard Worker             }
106*90c8c64dSAndroid Build Coastguard Worker         });
107*90c8c64dSAndroid Build Coastguard Worker 
108*90c8c64dSAndroid Build Coastguard Worker         return rootView;
109*90c8c64dSAndroid Build Coastguard Worker     }
110*90c8c64dSAndroid Build Coastguard Worker 
111*90c8c64dSAndroid Build Coastguard Worker     /**
112*90c8c64dSAndroid Build Coastguard Worker      * Set RecyclerView's LayoutManager to the one given.
113*90c8c64dSAndroid Build Coastguard Worker      *
114*90c8c64dSAndroid Build Coastguard Worker      * @param layoutManagerType Type of layout manager to switch to.
115*90c8c64dSAndroid Build Coastguard Worker      */
setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType)116*90c8c64dSAndroid Build Coastguard Worker     public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
117*90c8c64dSAndroid Build Coastguard Worker         int scrollPosition = 0;
118*90c8c64dSAndroid Build Coastguard Worker 
119*90c8c64dSAndroid Build Coastguard Worker         // If a layout manager has already been set, get current scroll position.
120*90c8c64dSAndroid Build Coastguard Worker         if (mRecyclerView.getLayoutManager() != null) {
121*90c8c64dSAndroid Build Coastguard Worker             scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
122*90c8c64dSAndroid Build Coastguard Worker                     .findFirstCompletelyVisibleItemPosition();
123*90c8c64dSAndroid Build Coastguard Worker         }
124*90c8c64dSAndroid Build Coastguard Worker 
125*90c8c64dSAndroid Build Coastguard Worker         switch (layoutManagerType) {
126*90c8c64dSAndroid Build Coastguard Worker             case GRID_LAYOUT_MANAGER:
127*90c8c64dSAndroid Build Coastguard Worker                 mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT);
128*90c8c64dSAndroid Build Coastguard Worker                 mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;
129*90c8c64dSAndroid Build Coastguard Worker                 break;
130*90c8c64dSAndroid Build Coastguard Worker             case LINEAR_LAYOUT_MANAGER:
131*90c8c64dSAndroid Build Coastguard Worker                 mLayoutManager = new LinearLayoutManager(getActivity());
132*90c8c64dSAndroid Build Coastguard Worker                 mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
133*90c8c64dSAndroid Build Coastguard Worker                 break;
134*90c8c64dSAndroid Build Coastguard Worker             default:
135*90c8c64dSAndroid Build Coastguard Worker                 mLayoutManager = new LinearLayoutManager(getActivity());
136*90c8c64dSAndroid Build Coastguard Worker                 mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
137*90c8c64dSAndroid Build Coastguard Worker         }
138*90c8c64dSAndroid Build Coastguard Worker 
139*90c8c64dSAndroid Build Coastguard Worker         mRecyclerView.setLayoutManager(mLayoutManager);
140*90c8c64dSAndroid Build Coastguard Worker         mRecyclerView.scrollToPosition(scrollPosition);
141*90c8c64dSAndroid Build Coastguard Worker     }
142*90c8c64dSAndroid Build Coastguard Worker 
143*90c8c64dSAndroid Build Coastguard Worker     @Override
onSaveInstanceState(Bundle savedInstanceState)144*90c8c64dSAndroid Build Coastguard Worker     public void onSaveInstanceState(Bundle savedInstanceState) {
145*90c8c64dSAndroid Build Coastguard Worker         // Save currently selected layout manager.
146*90c8c64dSAndroid Build Coastguard Worker         savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
147*90c8c64dSAndroid Build Coastguard Worker         super.onSaveInstanceState(savedInstanceState);
148*90c8c64dSAndroid Build Coastguard Worker     }
149*90c8c64dSAndroid Build Coastguard Worker 
150*90c8c64dSAndroid Build Coastguard Worker     /**
151*90c8c64dSAndroid Build Coastguard Worker      * Generates Strings for RecyclerView's adapter. This data would usually come
152*90c8c64dSAndroid Build Coastguard Worker      * from a local content provider or remote server.
153*90c8c64dSAndroid Build Coastguard Worker      */
initDataset()154*90c8c64dSAndroid Build Coastguard Worker     private void initDataset() {
155*90c8c64dSAndroid Build Coastguard Worker         mDataset = new String[DATASET_COUNT];
156*90c8c64dSAndroid Build Coastguard Worker         for (int i = 0; i < DATASET_COUNT; i++) {
157*90c8c64dSAndroid Build Coastguard Worker             mDataset[i] = "This is element #" + i;
158*90c8c64dSAndroid Build Coastguard Worker         }
159*90c8c64dSAndroid Build Coastguard Worker     }
160*90c8c64dSAndroid Build Coastguard Worker }
161