BaseLayoutManagerActivity.java revision 5b611d45d8d84bd604e6ce855f9520499ff89b68
11f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar/* 21f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * Copyright (C) 2014 The Android Open Source Project 31f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * 41f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 51f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * you may not use this file except in compliance with the License. 61f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * You may obtain a copy of the License at 71f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * 81f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 91f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * 101f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * Unless required by applicable law or agreed to in writing, software 111f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 121f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * See the License for the specific language governing permissions and 141f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * limitations under the License. 151f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar */ 161f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 171f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarpackage com.example.android.supportv7.widget; 181f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 191f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport com.example.android.supportv7.Cheeses; 201f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport com.example.android.supportv7.R; 211f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport com.example.android.supportv7.widget.adapter.SimpleStringAdapter; 225b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport com.example.android.supportv7.widget.util.ConfigToggle; 235b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport com.example.android.supportv7.widget.util.ConfigViewHolder; 241f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 251f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.app.Activity; 261f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.content.Context; 271f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.os.Bundle; 281f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.support.v7.widget.LinearLayoutManager; 291f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.support.v7.widget.RecyclerView; 305b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.view.LayoutInflater; 311f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.view.View; 321f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.view.ViewGroup; 331f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.BaseAdapter; 341f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.CheckBox; 351f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.CompoundButton; 361f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.EditText; 371f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.Spinner; 381f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarimport android.widget.TextView; 391f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 401f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar/** 411f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * A simple activity that can be extended to demonstrate LayoutManagers. 421f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * <p> 431f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * It initializes a sample adapter and a list of configuration options. Extending activities can 441f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar * define the {@link ConfigToggle} list depending on its functionality. 451f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar */ 461f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyarabstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutManager> 471f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar extends Activity { 481f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 491f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected T mLayoutManager; 501f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 511f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected RecyclerView mRecyclerView; 521f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 531f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar private ConfigToggle[] mConfigToggles; 541f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 551f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 561f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected void onCreate(Bundle savedInstanceState) { 571f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar super.onCreate(savedInstanceState); 581f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar setContentView(R.layout.activity_base_layout_manager); 591f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar initToggles(); 601f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar initRecyclerView(); 611f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar initSpinner(); 621f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 631f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 641f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar abstract protected T createLayoutManager(); 651f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 661f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar private void initRecyclerView() { 671f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 681f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.setHasFixedSize(true); 691f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mLayoutManager = createLayoutManager(); 701f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.setLayoutManager(mLayoutManager); 711f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.setAdapter(createAdapter()); 721f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.getItemAnimator().setSupportsChangeAnimations(true); 731f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar onRecyclerViewInit(mRecyclerView); 741f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 751f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 761f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected void onRecyclerViewInit(RecyclerView recyclerView) { 771f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 781f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 791f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 801f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected RecyclerView.Adapter createAdapter() { 811f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { 821f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 831f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 841f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar int viewType) { 851f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final SimpleStringAdapter.ViewHolder vh = super 861f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar .onCreateViewHolder(parent, viewType); 871f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar vh.itemView.setOnClickListener(new View.OnClickListener() { 881f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 891f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public void onClick(View v) { 904fa1fe35a2e2f6aa8973bbb698f5191b7acc8d95Yigit Boyar final int pos = vh.getAdapterPosition(); 914fa1fe35a2e2f6aa8973bbb698f5191b7acc8d95Yigit Boyar if (pos != RecyclerView.NO_POSITION && pos + 1 < getItemCount()) { 921f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar swap(pos, pos + 1); 931f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 941f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 951f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar }); 961f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return vh; 971f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 981f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar }; 991f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1001f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1011f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar private void initToggles() { 1021f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mConfigToggles = createConfigToggles(); 1031f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view); 1041f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar configView.setAdapter(mConfigAdapter); 1051f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, 1061f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar false)); 1071f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar configView.setHasFixedSize(true); 1081f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1091f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1101f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public void onScrollClicked(View view) { 1111f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset); 1121f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final CheckBox checkBox = (CheckBox) findViewById(R.id.enable_smooth_scroll); 1131f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final Spinner spinner = (Spinner) findViewById(R.id.spinner); 1141f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1151f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar Integer offset = null; 1161f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar String offsetString = scrollOffset.getText().toString(); 1171f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar try { 1181f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar offset = Integer.parseInt(offsetString); 1191f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } catch (NumberFormatException ex) { 1201f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1211f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1221f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final boolean smooth = checkBox.isChecked(); 1231f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar if (offset == null) { 1241f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar scrollToPosition(smooth, spinner.getSelectedItemPosition()); 1251f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } else { 1261f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar scrollToPositionWithOffset(smooth, spinner.getSelectedItemPosition(), offset); 1271f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1281f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1291f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1301f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar private void initSpinner() { 1311f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar final Spinner spinner = (Spinner) findViewById(R.id.spinner); 1321f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar spinner.setAdapter(new BaseAdapter() { 1331f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1341f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public int getCount() { 1351f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return mRecyclerView.getAdapter().getItemCount(); 1361f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1371f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1381f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1391f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public Integer getItem(int position) { 1401f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return position; 1411f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1421f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1431f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1441f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public long getItemId(int position) { 1451f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return position; 1461f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1471f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1481f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1491f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public View getView(int position, View convertView, ViewGroup parent) { 1501f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar if (convertView == null) { 1511f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar convertView = new TextView(parent.getContext()); 1521f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1531f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar ((TextView) convertView).setText(" " + position + " "); 1541f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return convertView; 1551f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1561f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar }); 1571f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1581f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1591f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected void scrollToPosition(boolean smooth, int position) { 1601f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar if (smooth) { 1611f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.smoothScrollToPosition(position); 1621f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } else { 1631f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar mRecyclerView.scrollToPosition(position); 1641f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1651f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1661f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1671f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) { 1681f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar scrollToPosition(smooth, position); 1691f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1701f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1711f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar abstract ConfigToggle[] createConfigToggles(); 1721f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1731f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() { 1741f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1751f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 1765b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return new ConfigViewHolder(LayoutInflater.from(parent.getContext()) 1775b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar .inflate(R.layout.config_view_toggle, parent, false)); 1781f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1791f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1801f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1811f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public void onBindViewHolder(ConfigViewHolder holder, int position) { 1821f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar ConfigToggle toggle = mConfigToggles[position]; 1831f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar holder.bind(toggle); 1841f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1851f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar 1861f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar @Override 1871f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar public int getItemCount() { 1881f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar return mConfigToggles.length; 1891f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar } 1901f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar }; 1911f30fc8732560027f364ad42bbc3f7db8aace8adYigit Boyar} 192