1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.example.android.supportv7.widget; 18 19import com.example.android.supportv7.Cheeses; 20import com.example.android.supportv7.R; 21import com.example.android.supportv7.widget.adapter.SimpleStringAdapter; 22import com.example.android.supportv7.widget.util.ConfigToggle; 23import com.example.android.supportv7.widget.util.ConfigViewHolder; 24 25import android.app.Activity; 26import android.content.Context; 27import android.os.Bundle; 28import android.support.v7.widget.DefaultItemAnimator; 29import android.support.v7.widget.LinearLayoutManager; 30import android.support.v7.widget.RecyclerView; 31import android.view.LayoutInflater; 32import android.view.View; 33import android.view.ViewGroup; 34import android.widget.BaseAdapter; 35import android.widget.CheckBox; 36import android.widget.CompoundButton; 37import android.widget.EditText; 38import android.widget.Spinner; 39import android.widget.TextView; 40 41/** 42 * A simple activity that can be extended to demonstrate LayoutManagers. 43 * <p> 44 * It initializes a sample adapter and a list of configuration options. Extending activities can 45 * define the {@link ConfigToggle} list depending on its functionality. 46 */ 47abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutManager> 48 extends Activity { 49 50 protected T mLayoutManager; 51 52 protected RecyclerView mRecyclerView; 53 54 private ConfigToggle[] mConfigToggles; 55 56 @Override 57 protected void onCreate(Bundle savedInstanceState) { 58 super.onCreate(savedInstanceState); 59 setContentView(R.layout.activity_base_layout_manager); 60 initToggles(); 61 initRecyclerView(); 62 initSpinner(); 63 } 64 65 abstract protected T createLayoutManager(); 66 67 private void initRecyclerView() { 68 mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 69 mRecyclerView.setHasFixedSize(true); 70 mLayoutManager = createLayoutManager(); 71 mRecyclerView.setLayoutManager(mLayoutManager); 72 mRecyclerView.setAdapter(createAdapter()); 73 ((DefaultItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true); 74 onRecyclerViewInit(mRecyclerView); 75 } 76 77 protected void onRecyclerViewInit(RecyclerView recyclerView) { 78 79 } 80 81 protected RecyclerView.Adapter createAdapter() { 82 return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { 83 @Override 84 public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 85 int viewType) { 86 final SimpleStringAdapter.ViewHolder vh = super 87 .onCreateViewHolder(parent, viewType); 88 vh.itemView.setOnClickListener(new View.OnClickListener() { 89 @Override 90 public void onClick(View v) { 91 final int pos = vh.getAdapterPosition(); 92 if (pos != RecyclerView.NO_POSITION && pos + 1 < getItemCount()) { 93 swap(pos, pos + 1); 94 } 95 } 96 }); 97 return vh; 98 } 99 }; 100 } 101 102 private void initToggles() { 103 mConfigToggles = createConfigToggles(); 104 RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view); 105 configView.setAdapter(mConfigAdapter); 106 configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, 107 false)); 108 configView.setHasFixedSize(true); 109 } 110 111 public void onScrollClicked(View view) { 112 final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset); 113 final CheckBox checkBox = (CheckBox) findViewById(R.id.enable_smooth_scroll); 114 final Spinner spinner = (Spinner) findViewById(R.id.spinner); 115 116 Integer offset = null; 117 String offsetString = scrollOffset.getText().toString(); 118 try { 119 offset = Integer.parseInt(offsetString); 120 } catch (NumberFormatException ex) { 121 122 } 123 final boolean smooth = checkBox.isChecked(); 124 if (offset == null) { 125 scrollToPosition(smooth, spinner.getSelectedItemPosition()); 126 } else { 127 scrollToPositionWithOffset(smooth, spinner.getSelectedItemPosition(), offset); 128 } 129 } 130 131 private void initSpinner() { 132 final Spinner spinner = (Spinner) findViewById(R.id.spinner); 133 spinner.setAdapter(new BaseAdapter() { 134 @Override 135 public int getCount() { 136 return mRecyclerView.getAdapter().getItemCount(); 137 } 138 139 @Override 140 public Integer getItem(int position) { 141 return position; 142 } 143 144 @Override 145 public long getItemId(int position) { 146 return position; 147 } 148 149 @Override 150 public View getView(int position, View convertView, ViewGroup parent) { 151 if (convertView == null) { 152 convertView = new TextView(parent.getContext()); 153 } 154 ((TextView) convertView).setText(" " + position + " "); 155 return convertView; 156 } 157 }); 158 } 159 160 protected void scrollToPosition(boolean smooth, int position) { 161 if (smooth) { 162 mRecyclerView.smoothScrollToPosition(position); 163 } else { 164 mRecyclerView.scrollToPosition(position); 165 } 166 } 167 168 protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) { 169 scrollToPosition(smooth, position); 170 } 171 172 protected ConfigToggle[] createConfigToggles() { 173 return new ConfigToggle[] {}; 174 } 175 176 private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() { 177 @Override 178 public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 179 return new ConfigViewHolder(LayoutInflater.from(parent.getContext()) 180 .inflate(R.layout.config_view_toggle, parent, false)); 181 } 182 183 @Override 184 public void onBindViewHolder(ConfigViewHolder holder, int position) { 185 ConfigToggle toggle = mConfigToggles[position]; 186 holder.bind(toggle); 187 } 188 189 @Override 190 public int getItemCount() { 191 return mConfigToggles.length; 192 } 193 }; 194} 195