Merge "Add grid manager demo to Support7Demo app" into lmp-dev
This commit is contained in:
@@ -204,6 +204,15 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".widget.GridLayoutManagerActivity"
|
||||
android:label="@string/grid_layout_manager"
|
||||
android:theme="@style/Theme.AppCompat">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="com.example.android.supportv7.SAMPLE_CODE" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".view.CardViewActivity"
|
||||
android:label="@string/card_view"
|
||||
android:theme="@style/Theme.AppCompat">
|
||||
|
||||
@@ -21,6 +21,13 @@
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<CheckBox
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
android:id="@+id/enable_smooth_scroll"
|
||||
android:text="smooth scroll"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<EditText
|
||||
android:id="@+id/scroll_offset"
|
||||
android:layout_width="wrap_content"
|
||||
@@ -31,11 +38,10 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/spinner"/>
|
||||
<CheckBox
|
||||
android:id="@+id/enable_smooth_scroll"
|
||||
android:text="smooth scroll"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<Button android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="scroll"
|
||||
android:onClick="onScrollClicked"/>
|
||||
</LinearLayout>
|
||||
|
||||
<android.support.v7.widget.RecyclerView
|
||||
@@ -97,7 +97,8 @@
|
||||
|
||||
<string name="recycler_view">RecyclerView/RecyclerViewActivity</string>
|
||||
<string name="animated_recycler_view">RecyclerView/AnimatedRecyclerView</string>
|
||||
<string name="linear_layout_manager">Linear Layout Manager</string>
|
||||
<string name="linear_layout_manager">RecyclerView/Linear Layout Manager</string>
|
||||
<string name="grid_layout_manager">RecyclerView/Grid Layout Manager</string>
|
||||
<string name="checkbox_orientation">Horz.</string>
|
||||
<string name="checkbox_reverse">Rev.</string>
|
||||
<string name="checkbox_layout_dir">Layout Dir</string>
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* 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 android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
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());
|
||||
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.getPosition();
|
||||
if (pos + 1 < getItemCount()) {
|
||||
swap(pos, pos + 1);
|
||||
}
|
||||
notifyItemChanged(pos);
|
||||
}
|
||||
});
|
||||
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 class ConfigViewHolder extends RecyclerView.ViewHolder
|
||||
implements CompoundButton.OnCheckedChangeListener {
|
||||
|
||||
private CheckBox mCheckBox;
|
||||
|
||||
private ConfigToggle mConfigToggle;
|
||||
|
||||
public ConfigViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
mCheckBox = (CheckBox) itemView;
|
||||
mCheckBox.setOnCheckedChangeListener(this);
|
||||
}
|
||||
|
||||
public void bind(ConfigToggle toggle) {
|
||||
mConfigToggle = toggle;
|
||||
mCheckBox.setText(toggle.getText());
|
||||
mCheckBox.setChecked(toggle.isChecked());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (mConfigToggle != null) {
|
||||
mConfigToggle.onChange(isChecked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public abstract static class ConfigToggle {
|
||||
|
||||
private String mLabel;
|
||||
|
||||
protected ConfigToggle(Context context, int labelId) {
|
||||
mLabel = context.getResources().getString(labelId);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return mLabel;
|
||||
}
|
||||
|
||||
abstract public boolean isChecked();
|
||||
|
||||
abstract public void onChange(boolean newValue);
|
||||
}
|
||||
|
||||
|
||||
private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
|
||||
@Override
|
||||
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return new ConfigViewHolder(new CheckBox(parent.getContext()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ConfigViewHolder holder, int position) {
|
||||
ConfigToggle toggle = mConfigToggles[position];
|
||||
holder.bind(toggle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mConfigToggles.length;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* 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 android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.widget.GridLayoutManager;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/**
|
||||
* A sample Activity to demonstrate capabilities of {@link GridLayoutManager}.
|
||||
*/
|
||||
public class GridLayoutManagerActivity extends BaseLayoutManagerActivity<GridLayoutManager> {
|
||||
SimpleStringAdapter mAdapter;
|
||||
@Override
|
||||
protected GridLayoutManager createLayoutManager() {
|
||||
GridLayoutManager lm = new GridLayoutManager(this, 3);
|
||||
lm.setReverseLayout(true);
|
||||
lm.setSpanSizeLookup(mSpanSizeLookup);
|
||||
return lm;
|
||||
}
|
||||
|
||||
GridLayoutManager.SpanSizeLookup mSpanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
|
||||
@Override
|
||||
public int getSpanSize(int position) {
|
||||
String item = mAdapter.getValueAt(position);
|
||||
return 1 + (Math.abs(item.hashCode()) % mLayoutManager.getSpanCount());
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
ConfigToggle[] createConfigToggles() {
|
||||
return new ConfigToggle[]{
|
||||
new ConfigToggle(this, R.string.checkbox_orientation) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mLayoutManager.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
|
||||
: LinearLayoutManager.VERTICAL);
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.checkbox_reverse) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mLayoutManager.getReverseLayout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mLayoutManager.setReverseLayout(newValue);
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.checkbox_layout_dir) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return ViewCompat.getLayoutDirection(mRecyclerView) ==
|
||||
ViewCompat.LAYOUT_DIRECTION_RTL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
|
||||
ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
|
||||
}
|
||||
},
|
||||
new ConfigToggle(this, R.string.checkbox_stack_from_end) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mLayoutManager.getStackFromEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mLayoutManager.setStackFromEnd(newValue);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) {
|
||||
if (smooth) {
|
||||
super.scrollToPositionWithOffset(smooth, position, offset);
|
||||
} else {
|
||||
mLayoutManager.scrollToPositionWithOffset(position, offset);
|
||||
}
|
||||
}
|
||||
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
mAdapter = 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.getPosition();
|
||||
if (pos + 1 < getItemCount()) {
|
||||
swap(pos, pos + 1);
|
||||
}
|
||||
notifyItemChanged(pos);
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
}
|
||||
};
|
||||
return mAdapter;
|
||||
}
|
||||
}
|
||||
@@ -16,222 +16,61 @@
|
||||
|
||||
package com.example.android.supportv7.widget;
|
||||
|
||||
import com.example.android.supportv7.Cheeses;
|
||||
import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
|
||||
import com.example.android.supportv7.widget.decorator.DividerItemDecoration;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.example.android.supportv7.R;
|
||||
|
||||
/**
|
||||
* A sample activity that uses {@link android.support.v7.widget.LinearLayoutManager}.
|
||||
* A sample activity that uses {@link LinearLayoutManager}.
|
||||
*/
|
||||
public class LinearLayoutManagerActivity extends Activity {
|
||||
|
||||
private RecyclerView.LayoutManager mListLayoutManager;
|
||||
|
||||
private ListWrapper mListWrapper;
|
||||
|
||||
private RecyclerView mRecyclerView;
|
||||
|
||||
public class LinearLayoutManagerActivity extends BaseLayoutManagerActivity<LinearLayoutManager> {
|
||||
private DividerItemDecoration mDividerItemDecoration;
|
||||
|
||||
private ConfigToggle[] mConfigToggles;
|
||||
@Override
|
||||
protected LinearLayoutManager createLayoutManager() {
|
||||
return new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_linear_layout_manager);
|
||||
initConfig();
|
||||
initRecyclerView();
|
||||
initSpinner();
|
||||
protected void onRecyclerViewInit(RecyclerView recyclerView) {
|
||||
mDividerItemDecoration = new DividerItemDecoration(this, mLayoutManager.getOrientation());
|
||||
recyclerView.addItemDecoration(mDividerItemDecoration);
|
||||
}
|
||||
|
||||
private void initRecyclerView() {
|
||||
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
|
||||
mRecyclerView.setHasFixedSize(true);
|
||||
mListLayoutManager = new LinearLayoutManager(this);
|
||||
mRecyclerView.setLayoutManager(mListLayoutManager);
|
||||
mRecyclerView.setAdapter(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.getPosition();
|
||||
if (pos + 1 < getItemCount()) {
|
||||
swap(pos, pos + 1);
|
||||
}
|
||||
notifyItemChanged(pos);
|
||||
}
|
||||
});
|
||||
return vh;
|
||||
}
|
||||
});
|
||||
initListForLayoutManager();
|
||||
}
|
||||
|
||||
private void initListForLayoutManager() {
|
||||
mListWrapper = new ListWrapper() {
|
||||
@Override
|
||||
public int getOrientation() {
|
||||
return lm().getOrientation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOrientation(int orientation) {
|
||||
lm().setOrientation(orientation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getReverseLayout() {
|
||||
return lm().getReverseLayout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setReverseLayout(boolean newValue) {
|
||||
lm().setReverseLayout(newValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getStackFromEnd() {
|
||||
return lm().getStackFromEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStackFromEnd(boolean newValue) {
|
||||
lm().setStackFromEnd(newValue);
|
||||
}
|
||||
|
||||
private LinearLayoutManager lm() {
|
||||
return (LinearLayoutManager) mListLayoutManager;
|
||||
}
|
||||
};
|
||||
if (mDividerItemDecoration != null) {
|
||||
mRecyclerView.removeItemDecoration(mDividerItemDecoration);
|
||||
}
|
||||
mDividerItemDecoration = new DividerItemDecoration(this, mListWrapper.getOrientation());
|
||||
mRecyclerView.addItemDecoration(mDividerItemDecoration);
|
||||
}
|
||||
|
||||
private void initConfig() {
|
||||
RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
|
||||
initToggles();
|
||||
configView.setAdapter(mConfigAdapter);
|
||||
configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
|
||||
false));
|
||||
configView.setHasFixedSize(true);
|
||||
}
|
||||
|
||||
private void initSpinner() {
|
||||
final CheckBox checkBox = (CheckBox)
|
||||
findViewById(R.id.enable_smooth_scroll);
|
||||
|
||||
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
|
||||
final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset);
|
||||
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;
|
||||
}
|
||||
});
|
||||
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
int offset = Integer.MIN_VALUE;
|
||||
String offsetString = scrollOffset.getText().toString();
|
||||
try {
|
||||
offset = Integer.parseInt(offsetString);
|
||||
} catch (NumberFormatException ex) {
|
||||
|
||||
}
|
||||
|
||||
if (offset == Integer.MIN_VALUE) {
|
||||
if (checkBox.isChecked()) {
|
||||
mRecyclerView.smoothScrollToPosition(position);
|
||||
} else {
|
||||
mRecyclerView.scrollToPosition(position);
|
||||
}
|
||||
} else {
|
||||
// ignore offset until we add recycling list view with smooth scroll to offset
|
||||
mRecyclerView.smoothScrollToPosition(position);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initToggles() {
|
||||
mConfigToggles = new ConfigToggle[]{
|
||||
new ConfigToggle(R.string.checkbox_orientation) {
|
||||
@Override
|
||||
BaseLayoutManagerActivity.ConfigToggle[] createConfigToggles() {
|
||||
return new ConfigToggle[]{
|
||||
new ConfigToggle(this, R.string.checkbox_orientation) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mListWrapper.getOrientation() == LinearLayoutManager.HORIZONTAL;
|
||||
return mLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mListWrapper.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
|
||||
mLayoutManager.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
|
||||
: LinearLayoutManager.VERTICAL);
|
||||
if (mDividerItemDecoration != null) {
|
||||
mDividerItemDecoration.setOrientation(mListWrapper.getOrientation());
|
||||
mDividerItemDecoration.setOrientation(mLayoutManager.getOrientation());
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
new ConfigToggle(R.string.checkbox_reverse) {
|
||||
new ConfigToggle(this, R.string.checkbox_reverse) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mListWrapper.getReverseLayout();
|
||||
return mLayoutManager.getReverseLayout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mListWrapper.setReverseLayout(newValue);
|
||||
mLayoutManager.setReverseLayout(newValue);
|
||||
}
|
||||
},
|
||||
new ConfigToggle(R.string.checkbox_layout_dir) {
|
||||
new ConfigToggle(this, R.string.checkbox_layout_dir) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return ViewCompat.getLayoutDirection(mRecyclerView) ==
|
||||
@@ -244,103 +83,17 @@ public class LinearLayoutManagerActivity extends Activity {
|
||||
ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
|
||||
}
|
||||
},
|
||||
new ConfigToggle(R.string.checkbox_stack_from_end) {
|
||||
new ConfigToggle(this, R.string.checkbox_stack_from_end) {
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return mListWrapper.getStackFromEnd();
|
||||
return mLayoutManager.getStackFromEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean newValue) {
|
||||
mListWrapper.setStackFromEnd(newValue);
|
||||
mLayoutManager.setStackFromEnd(newValue);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private class ConfigViewHolder extends RecyclerView.ViewHolder
|
||||
implements CompoundButton.OnCheckedChangeListener {
|
||||
|
||||
private CheckBox mCheckBox;
|
||||
|
||||
private ConfigToggle mConfigToggle;
|
||||
|
||||
public ConfigViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
mCheckBox = (CheckBox) itemView;
|
||||
mCheckBox.setOnCheckedChangeListener(this);
|
||||
}
|
||||
|
||||
public void render(ConfigToggle toggle) {
|
||||
mConfigToggle = toggle;
|
||||
mCheckBox.setText(toggle.getText());
|
||||
mCheckBox.setChecked(toggle.isChecked());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (mConfigToggle != null) {
|
||||
mConfigToggle.onChange(isChecked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private abstract class ConfigToggle {
|
||||
|
||||
private String mLabel;
|
||||
|
||||
protected ConfigToggle(int labelId) {
|
||||
mLabel = getResources().getString(labelId);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return mLabel;
|
||||
}
|
||||
|
||||
abstract public boolean isChecked();
|
||||
|
||||
abstract public void onChange(boolean newValue);
|
||||
}
|
||||
|
||||
|
||||
private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
|
||||
@Override
|
||||
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return new ConfigViewHolder(new CheckBox(parent.getContext()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ConfigViewHolder holder, int position) {
|
||||
ConfigToggle toggle = mConfigToggles[position];
|
||||
holder.render(toggle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mConfigToggles.length;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* To avoid adding interfaces to LayoutManager for the demo, we use this wrapper class to
|
||||
* call different LayoutManagers
|
||||
*/
|
||||
private static interface ListWrapper {
|
||||
|
||||
int getOrientation();
|
||||
|
||||
void setOrientation(int orientation);
|
||||
|
||||
boolean getReverseLayout();
|
||||
|
||||
void setReverseLayout(boolean newValue);
|
||||
|
||||
boolean getStackFromEnd();
|
||||
|
||||
void setStackFromEnd(boolean newValue);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
|
||||
private ArrayList<String> mValues;
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
public String mBoundString;
|
||||
public TextView mTextView;
|
||||
|
||||
public ViewHolder(TextView v) {
|
||||
@@ -47,6 +47,10 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
|
||||
}
|
||||
}
|
||||
|
||||
public String getValueAt(int position) {
|
||||
return mValues.get(position);
|
||||
}
|
||||
|
||||
public SimpleStringAdapter(Context context, String[] strings) {
|
||||
TypedValue val = new TypedValue();
|
||||
if (context.getTheme() != null) {
|
||||
@@ -86,6 +90,7 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||
holder.mBoundString = mValues.get(position);
|
||||
holder.mTextView.setText(position + ":" + mValues.get(position));
|
||||
holder.mTextView.setMinHeight((200 + mValues.get(position).length() * 10));
|
||||
holder.mTextView.setBackgroundColor(getBackgroundColor(position));
|
||||
@@ -95,7 +100,7 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
|
||||
switch (position % 4) {
|
||||
case 0: return Color.BLACK;
|
||||
case 1: return Color.RED;
|
||||
case 2: return Color.GREEN;
|
||||
case 2: return Color.DKGRAY;
|
||||
case 3: return Color.BLUE;
|
||||
}
|
||||
return Color.TRANSPARENT;
|
||||
|
||||
Reference in New Issue
Block a user