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 android.app.Activity; 20import android.os.Bundle; 21import android.support.v7.widget.DefaultItemAnimator; 22import android.support.v7.widget.LinearLayoutManager; 23import android.support.v7.widget.RecyclerView; 24import android.view.LayoutInflater; 25import android.view.View; 26import android.view.ViewGroup; 27import android.widget.BaseAdapter; 28import android.widget.CheckBox; 29import android.widget.EditText; 30import android.widget.Spinner; 31import android.widget.TextView; 32 33import com.example.android.supportv7.Cheeses; 34import com.example.android.supportv7.R; 35import com.example.android.supportv7.widget.adapter.SimpleStringAdapter; 36import com.example.android.supportv7.widget.util.ConfigToggle; 37import com.example.android.supportv7.widget.util.ConfigViewHolder; 38 39/** 40 * A simple activity that can be extended to demonstrate LayoutManagers. 41 * <p> 42 * It initializes a sample adapter and a list of configuration options. Extending activities can 43 * define the {@link ConfigToggle} list depending on its functionality. 44 */ 45abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutManager> 46 extends Activity { 47 48 protected T mLayoutManager; 49 50 protected RecyclerView mRecyclerView; 51 52 private ConfigToggle[] mConfigToggles; 53 54 @Override 55 protected void onCreate(Bundle savedInstanceState) { 56 super.onCreate(savedInstanceState); 57 setContentView(R.layout.activity_base_layout_manager); 58 initToggles(); 59 initRecyclerView(); 60 initSpinner(); 61 } 62 63 abstract protected T createLayoutManager(); 64 65 private void initRecyclerView() { 66 mRecyclerView = findViewById(R.id.recycler_view); 67 mRecyclerView.setHasFixedSize(true); 68 mLayoutManager = createLayoutManager(); 69 mRecyclerView.setLayoutManager(mLayoutManager); 70 mRecyclerView.setAdapter(createAdapter()); 71 ((DefaultItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true); 72 onRecyclerViewInit(mRecyclerView); 73 } 74 75 protected void onRecyclerViewInit(RecyclerView recyclerView) { 76 77 } 78 79 protected RecyclerView.Adapter createAdapter() { 80 return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { 81 @Override 82 public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 83 int viewType) { 84 final SimpleStringAdapter.ViewHolder vh = super 85 .onCreateViewHolder(parent, viewType); 86 vh.itemView.setOnClickListener(new View.OnClickListener() { 87 @Override 88 public void onClick(View v) { 89 final int pos = vh.getAdapterPosition(); 90 if (pos != RecyclerView.NO_POSITION && pos + 1 < getItemCount()) { 91 swap(pos, pos + 1); 92 } 93 } 94 }); 95 return vh; 96 } 97 }; 98 } 99 100 private void initToggles() { 101 mConfigToggles = createConfigToggles(); 102 RecyclerView configView = findViewById(R.id.config_recycler_view); 103 configView.setAdapter(mConfigAdapter); 104 configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, 105 false)); 106 configView.setHasFixedSize(true); 107 } 108 109 public void onScrollClicked(View view) { 110 final EditText scrollOffset = findViewById(R.id.scroll_offset); 111 final CheckBox checkBox = findViewById(R.id.enable_smooth_scroll); 112 final Spinner spinner = findViewById(R.id.spinner); 113 114 Integer offset = null; 115 String offsetString = scrollOffset.getText().toString(); 116 try { 117 offset = Integer.parseInt(offsetString); 118 } catch (NumberFormatException ex) { 119 120 } 121 final boolean smooth = checkBox.isChecked(); 122 if (offset == null) { 123 scrollToPosition(smooth, spinner.getSelectedItemPosition()); 124 } else { 125 scrollToPositionWithOffset(smooth, spinner.getSelectedItemPosition(), offset); 126 } 127 } 128 129 private void initSpinner() { 130 final Spinner spinner = findViewById(R.id.spinner); 131 spinner.setAdapter(new BaseAdapter() { 132 @Override 133 public int getCount() { 134 return mRecyclerView.getAdapter().getItemCount(); 135 } 136 137 @Override 138 public Integer getItem(int position) { 139 return position; 140 } 141 142 @Override 143 public long getItemId(int position) { 144 return position; 145 } 146 147 @Override 148 public View getView(int position, View convertView, ViewGroup parent) { 149 if (convertView == null) { 150 convertView = new TextView(parent.getContext()); 151 } 152 ((TextView) convertView).setText(" " + position + " "); 153 return convertView; 154 } 155 }); 156 } 157 158 protected void scrollToPosition(boolean smooth, int position) { 159 if (smooth) { 160 mRecyclerView.smoothScrollToPosition(position); 161 } else { 162 mRecyclerView.scrollToPosition(position); 163 } 164 } 165 166 protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) { 167 scrollToPosition(smooth, position); 168 } 169 170 protected ConfigToggle[] createConfigToggles() { 171 return new ConfigToggle[] {}; 172 } 173 174 private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() { 175 @Override 176 public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 177 return new ConfigViewHolder(LayoutInflater.from(parent.getContext()) 178 .inflate(R.layout.config_view_toggle, parent, false)); 179 } 180 181 @Override 182 public void onBindViewHolder(ConfigViewHolder holder, int position) { 183 ConfigToggle toggle = mConfigToggles[position]; 184 holder.bind(toggle); 185 } 186 187 @Override 188 public int getItemCount() { 189 return mConfigToggles.length; 190 } 191 }; 192} 193