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