LinearLayoutManagerActivity.java revision 1244264d8066e64e90fa0b8088ffa50ae4624ca4
1e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar/*
2e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * Copyright (C) 2014 The Android Open Source Project
3e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar *
4e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * you may not use this file except in compliance with the License.
6e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * You may obtain a copy of the License at
7e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar *
8e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar *
10e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * See the License for the specific language governing permissions and
14e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * limitations under the License.
15e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar */
16e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
17e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarpackage com.example.android.supportv7.widget;
18e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
19e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport com.example.android.supportv7.Cheeses;
20e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
21e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport com.example.android.supportv7.widget.decorator.DividerItemDecoration;
22e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
23e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.app.Activity;
24e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.os.Bundle;
25e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.support.v4.view.ViewCompat;
26e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.support.v7.widget.LinearLayoutManager;
27e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.support.v7.widget.RecyclerView;
28e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.view.View;
29e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.view.ViewGroup;
30e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.AdapterView;
31e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.BaseAdapter;
32e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.CheckBox;
33e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.CompoundButton;
341244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyarimport android.widget.EditText;
35e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.Spinner;
36e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport android.widget.TextView;
37e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
38e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarimport com.example.android.supportv7.R;
39e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
40e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar/**
41e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar * A sample activity that uses {@link android.support.v7.widget.LinearLayoutManager}.
42e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar */
43e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyarpublic class LinearLayoutManagerActivity extends Activity {
44e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
451244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    private RecyclerView.LayoutManager mListLayoutManager;
461244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
471244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    private ListWrapper mListWrapper;
48e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
49e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private RecyclerView mRecyclerView;
50e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
51e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private DividerItemDecoration mDividerItemDecoration;
52e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
53e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private ConfigToggle[] mConfigToggles;
54e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
55e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    @Override
56e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    protected void onCreate(Bundle savedInstanceState) {
57e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        super.onCreate(savedInstanceState);
58e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        setContentView(R.layout.activity_linear_layout_manager);
59e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        initConfig();
60e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        initRecyclerView();
61e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        initSpinner();
62e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
63e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
64e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private void initRecyclerView() {
65e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
66e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mRecyclerView.setHasFixedSize(true);
67e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mListLayoutManager = new LinearLayoutManager(this);
68e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mRecyclerView.setLayoutManager(mListLayoutManager);
691244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        mRecyclerView.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
701244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
711244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
721244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    int viewType) {
731244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                final SimpleStringAdapter.ViewHolder vh = super
741244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        .onCreateViewHolder(parent, viewType);
751244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                vh.itemView.setOnClickListener(new View.OnClickListener() {
761244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    @Override
771244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    public void onClick(View v) {
781244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        final int pos = vh.getPosition();
791244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        if (pos + 1 < getItemCount()) {
801244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                            swap(pos, pos + 1);
811244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        }
821244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        notifyItemChanged(pos);
831244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    }
841244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                });
851244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                return vh;
861244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
871244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        });
881244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        initListForLayoutManager();
891244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    }
901244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
911244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    private void initListForLayoutManager() {
921244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        mListWrapper = new ListWrapper() {
931244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
941244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public int getOrientation() {
951244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                return lm().getOrientation();
961244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
971244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
981244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
991244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public void setOrientation(int orientation) {
1001244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                lm().setOrientation(orientation);
1011244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1021244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1031244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
1041244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public boolean getReverseLayout() {
1051244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                return lm().getReverseLayout();
1061244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1071244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1081244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
1091244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public void setReverseLayout(boolean newValue) {
1101244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                lm().setReverseLayout(newValue);
1111244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1121244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1131244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
1141244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public boolean getStackFromEnd() {
1151244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                return lm().getStackFromEnd();
1161244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1171244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1181244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            @Override
1191244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            public void setStackFromEnd(boolean newValue) {
1201244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                lm().setStackFromEnd(newValue);
1211244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1221244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1231244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            private LinearLayoutManager lm() {
1241244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                return (LinearLayoutManager) mListLayoutManager;
1251244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            }
1261244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        };
1271244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        if (mDividerItemDecoration != null) {
1281244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar            mRecyclerView.removeItemDecoration(mDividerItemDecoration);
1291244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        }
1301244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        mDividerItemDecoration = new DividerItemDecoration(this, mListWrapper.getOrientation());
131e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mRecyclerView.addItemDecoration(mDividerItemDecoration);
132e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
133e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
134e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private void initConfig() {
135e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
136e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        initToggles();
137e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        configView.setAdapter(mConfigAdapter);
138e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
139e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                false));
140e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        configView.setHasFixedSize(true);
141e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
142e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
143e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private void initSpinner() {
1441244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        final CheckBox checkBox = (CheckBox)
1451244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                findViewById(R.id.enable_smooth_scroll);
1461244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1471244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
1481244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset);
149e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        spinner.setAdapter(new BaseAdapter() {
150e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
151e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public int getCount() {
152e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                return mRecyclerView.getAdapter().getItemCount();
153e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
154e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
155e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
156e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public Integer getItem(int position) {
157e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                return position;
158e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
159e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
160e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
161e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public long getItemId(int position) {
162e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                return position;
163e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
164e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
165e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
166e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public View getView(int position, View convertView, ViewGroup parent) {
1671244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                if (convertView == null) {
168e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    convertView = new TextView(parent.getContext());
169e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                }
170e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                ((TextView) convertView).setText("" + position);
171e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                return convertView;
172e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
173e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        });
174e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
175e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
176e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1771244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                int offset = Integer.MIN_VALUE;
1781244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                String offsetString = scrollOffset.getText().toString();
1791244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                try {
1801244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    offset = Integer.parseInt(offsetString);
1811244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                } catch (NumberFormatException ex) {
1821244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1831244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                }
1841244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
1851244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                if (offset == Integer.MIN_VALUE) {
1861244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    if (checkBox.isChecked()) {
1871244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        mRecyclerView.smoothScrollToPosition(position);
1881244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    } else {
1891244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        mRecyclerView.scrollToPosition(position);
1901244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    }
1911244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                } else {
1921244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    // ignore offset until we add recycling list view with smooth scroll to offset
1931244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                    mRecyclerView.smoothScrollToPosition(position);
1941244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                }
1951244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
196e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
197e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
198e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            @Override
199e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            public void onNothingSelected(AdapterView<?> parent) {
200e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
201e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
202e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        });
203e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
204e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
205e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private void initToggles() {
206e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        mConfigToggles = new ConfigToggle[]{
207e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                new ConfigToggle(R.string.checkbox_orientation) {
208e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
209e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public boolean isChecked() {
2101244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        return mListWrapper.getOrientation() == LinearLayoutManager.HORIZONTAL;
211e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
212e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
213e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
214e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public void onChange(boolean newValue) {
2151244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        mListWrapper.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
216e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                                : LinearLayoutManager.VERTICAL);
2171244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        if (mDividerItemDecoration != null) {
2181244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                            mDividerItemDecoration.setOrientation(mListWrapper.getOrientation());
2191244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        }
2201244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
221e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
222e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                },
223e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                new ConfigToggle(R.string.checkbox_reverse) {
224e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
225e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public boolean isChecked() {
2261244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        return mListWrapper.getReverseLayout();
227e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
228e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
229e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
230e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public void onChange(boolean newValue) {
2311244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        mListWrapper.setReverseLayout(newValue);
232e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
233e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                },
234e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                new ConfigToggle(R.string.checkbox_layout_dir) {
235e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
236e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public boolean isChecked() {
237e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                        return ViewCompat.getLayoutDirection(mRecyclerView) ==
238e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                                ViewCompat.LAYOUT_DIRECTION_RTL;
239e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
240e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
241e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
242e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public void onChange(boolean newValue) {
243e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                        ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
244e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                                ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
245e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
246e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                },
247e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                new ConfigToggle(R.string.checkbox_stack_from_end) {
248e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
249e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public boolean isChecked() {
2501244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        return mListWrapper.getStackFromEnd();
251e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
252e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
253e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    @Override
254e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    public void onChange(boolean newValue) {
2551244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar                        mListWrapper.setStackFromEnd(newValue);
256e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                    }
257e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                }
258e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        };
259e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
260e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
261e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private class ConfigViewHolder extends RecyclerView.ViewHolder
262e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            implements CompoundButton.OnCheckedChangeListener {
263e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
264e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        private CheckBox mCheckBox;
265e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
266e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        private ConfigToggle mConfigToggle;
267e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
268e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public ConfigViewHolder(View itemView) {
269e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            super(itemView);
270e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mCheckBox = (CheckBox) itemView;
271e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mCheckBox.setOnCheckedChangeListener(this);
272e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
273e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
274e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public void render(ConfigToggle toggle) {
275e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mConfigToggle = toggle;
276e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mCheckBox.setText(toggle.getText());
277e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mCheckBox.setChecked(toggle.isChecked());
278e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
279e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
280e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        @Override
281e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
282e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            if (mConfigToggle != null) {
283e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar                mConfigToggle.onChange(isChecked);
284e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            }
285e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
286e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
287e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
288e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
289e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private abstract class ConfigToggle {
290e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
291e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        private String mLabel;
292e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
293e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        protected ConfigToggle(int labelId) {
294e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            mLabel = getResources().getString(labelId);
295e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
296e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
297e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public String getText() {
298e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            return mLabel;
299e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
300e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
301e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        abstract public boolean isChecked();
302e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
303e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        abstract public void onChange(boolean newValue);
304e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    }
305e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
306e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
307e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
308e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        @Override
309e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
310e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            return new ConfigViewHolder(new CheckBox(parent.getContext()));
311e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
312e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
313e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        @Override
314e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public void onBindViewHolder(ConfigViewHolder holder, int position) {
315e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            ConfigToggle toggle = mConfigToggles[position];
316e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            holder.render(toggle);
317e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
318e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
319e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        @Override
320e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        public int getItemCount() {
321e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar            return mConfigToggles.length;
322e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar        }
323e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar    };
324e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar
3251244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3261244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    /**
3271244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar     * To avoid adding interfaces to LayoutManager for the demo, we use this wrapper class to
3281244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar     * call different LayoutManagers
3291244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar     */
3301244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    private static interface ListWrapper {
3311244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3321244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        int getOrientation();
3331244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3341244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        void setOrientation(int orientation);
3351244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3361244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        boolean getReverseLayout();
3371244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3381244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        void setReverseLayout(boolean newValue);
3391244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3401244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        boolean getStackFromEnd();
3411244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3421244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar        void setStackFromEnd(boolean newValue);
3431244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar    }
3441244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
3451244264d8066e64e90fa0b8088ffa50ae4624ca4Yigit Boyar
346e9f9a04c426e7423db0cd58ec8d2dc3ff2238a30Yigit Boyar}
347