| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.supportv7.widget; |
| |
| import com.example.android.supportv7.Cheeses; |
| import com.example.android.supportv7.R; |
| import com.example.android.supportv7.widget.adapter.SimpleStringAdapter; |
| import com.example.android.supportv7.widget.util.ConfigToggle; |
| import com.example.android.supportv7.widget.util.ConfigViewHolder; |
| |
| import android.app.Activity; |
| import android.content.Context; |
| import android.os.Bundle; |
| import android.support.v7.widget.DefaultItemAnimator; |
| import android.support.v7.widget.LinearLayoutManager; |
| import android.support.v7.widget.RecyclerView; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.BaseAdapter; |
| import android.widget.CheckBox; |
| import android.widget.CompoundButton; |
| import android.widget.EditText; |
| import android.widget.Spinner; |
| import android.widget.TextView; |
| |
| /** |
| * A simple activity that can be extended to demonstrate LayoutManagers. |
| * <p> |
| * It initializes a sample adapter and a list of configuration options. Extending activities can |
| * define the {@link ConfigToggle} list depending on its functionality. |
| */ |
| abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutManager> |
| extends Activity { |
| |
| protected T mLayoutManager; |
| |
| protected RecyclerView mRecyclerView; |
| |
| private ConfigToggle[] mConfigToggles; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_base_layout_manager); |
| initToggles(); |
| initRecyclerView(); |
| initSpinner(); |
| } |
| |
| abstract protected T createLayoutManager(); |
| |
| private void initRecyclerView() { |
| mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); |
| mRecyclerView.setHasFixedSize(true); |
| mLayoutManager = createLayoutManager(); |
| mRecyclerView.setLayoutManager(mLayoutManager); |
| mRecyclerView.setAdapter(createAdapter()); |
| ((DefaultItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true); |
| onRecyclerViewInit(mRecyclerView); |
| } |
| |
| protected void onRecyclerViewInit(RecyclerView recyclerView) { |
| |
| } |
| |
| protected RecyclerView.Adapter createAdapter() { |
| return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { |
| @Override |
| public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, |
| int viewType) { |
| final SimpleStringAdapter.ViewHolder vh = super |
| .onCreateViewHolder(parent, viewType); |
| vh.itemView.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| final int pos = vh.getAdapterPosition(); |
| if (pos != RecyclerView.NO_POSITION && pos + 1 < getItemCount()) { |
| swap(pos, pos + 1); |
| } |
| } |
| }); |
| return vh; |
| } |
| }; |
| } |
| |
| private void initToggles() { |
| mConfigToggles = createConfigToggles(); |
| RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view); |
| configView.setAdapter(mConfigAdapter); |
| configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, |
| false)); |
| configView.setHasFixedSize(true); |
| } |
| |
| public void onScrollClicked(View view) { |
| final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset); |
| final CheckBox checkBox = (CheckBox) findViewById(R.id.enable_smooth_scroll); |
| final Spinner spinner = (Spinner) findViewById(R.id.spinner); |
| |
| Integer offset = null; |
| String offsetString = scrollOffset.getText().toString(); |
| try { |
| offset = Integer.parseInt(offsetString); |
| } catch (NumberFormatException ex) { |
| |
| } |
| final boolean smooth = checkBox.isChecked(); |
| if (offset == null) { |
| scrollToPosition(smooth, spinner.getSelectedItemPosition()); |
| } else { |
| scrollToPositionWithOffset(smooth, spinner.getSelectedItemPosition(), offset); |
| } |
| } |
| |
| private void initSpinner() { |
| final Spinner spinner = (Spinner) findViewById(R.id.spinner); |
| spinner.setAdapter(new BaseAdapter() { |
| @Override |
| public int getCount() { |
| return mRecyclerView.getAdapter().getItemCount(); |
| } |
| |
| @Override |
| public Integer getItem(int position) { |
| return position; |
| } |
| |
| @Override |
| public long getItemId(int position) { |
| return position; |
| } |
| |
| @Override |
| public View getView(int position, View convertView, ViewGroup parent) { |
| if (convertView == null) { |
| convertView = new TextView(parent.getContext()); |
| } |
| ((TextView) convertView).setText(" " + position + " "); |
| return convertView; |
| } |
| }); |
| } |
| |
| protected void scrollToPosition(boolean smooth, int position) { |
| if (smooth) { |
| mRecyclerView.smoothScrollToPosition(position); |
| } else { |
| mRecyclerView.scrollToPosition(position); |
| } |
| } |
| |
| protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) { |
| scrollToPosition(smooth, position); |
| } |
| |
| abstract ConfigToggle[] createConfigToggles(); |
| |
| private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() { |
| @Override |
| public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
| return new ConfigViewHolder(LayoutInflater.from(parent.getContext()) |
| .inflate(R.layout.config_view_toggle, parent, false)); |
| } |
| |
| @Override |
| public void onBindViewHolder(ConfigViewHolder holder, int position) { |
| ConfigToggle toggle = mConfigToggles[position]; |
| holder.bind(toggle); |
| } |
| |
| @Override |
| public int getItemCount() { |
| return mConfigToggles.length; |
| } |
| }; |
| } |