am 864b97ae: am 6001125a: Merge "Updated recycler view demo with smooth scrolling" into klp-modular-dev

* commit '864b97ae3acf87af51bc9048fc120fbfbc33dfdb':
  Updated recycler view demo with smooth scrolling
This commit is contained in:
Yigit Boyar
2014-05-02 22:18:04 +00:00
committed by Android Git Automerger
3 changed files with 175 additions and 33 deletions

View File

@@ -17,15 +17,34 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<Spinner <LinearLayout
android:layout_width="wrap_content" android:orientation="horizontal"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:id="@+id/spinner"/> android:layout_height="wrap_content">
<EditText
android:id="@+id/scroll_offset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="numberSigned"
android:hint="offset"/>
<Spinner
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"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="100dp" android:layout_height="60dp"
android:scrollbars="horizontal"
android:id="@+id/config_recycler_view"/> android:id="@+id/config_recycler_view"/>
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:background="#ff0099cc"
android:scrollbarStyle="insideOverlay" android:scrollbarStyle="insideOverlay"
android:scrollbars="horizontal|vertical" android:scrollbars="horizontal|vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"

View File

@@ -25,16 +25,13 @@ import android.os.Bundle;
import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.LinearLayout; import android.widget.EditText;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
@@ -45,7 +42,9 @@ import com.example.android.supportv7.R;
*/ */
public class LinearLayoutManagerActivity extends Activity { public class LinearLayoutManagerActivity extends Activity {
private LinearLayoutManager mListLayoutManager; private RecyclerView.LayoutManager mListLayoutManager;
private ListWrapper mListWrapper;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
@@ -67,9 +66,68 @@ public class LinearLayoutManagerActivity extends Activity {
mRecyclerView.setHasFixedSize(true); mRecyclerView.setHasFixedSize(true);
mListLayoutManager = new LinearLayoutManager(this); mListLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mListLayoutManager); mRecyclerView.setLayoutManager(mListLayoutManager);
mRecyclerView.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings)); mRecyclerView.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
mDividerItemDecoration = new DividerItemDecoration(this, @Override
mListLayoutManager.getOrientation()); 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); mRecyclerView.addItemDecoration(mDividerItemDecoration);
} }
@@ -83,7 +141,11 @@ public class LinearLayoutManagerActivity extends Activity {
} }
private void initSpinner() { private void initSpinner() {
Spinner spinner = (Spinner) findViewById(R.id.spinner); 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() { spinner.setAdapter(new BaseAdapter() {
@Override @Override
public int getCount() { public int getCount() {
@@ -102,7 +164,7 @@ public class LinearLayoutManagerActivity extends Activity {
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) { if (convertView == null) {
convertView = new TextView(parent.getContext()); convertView = new TextView(parent.getContext());
} }
((TextView) convertView).setText("" + position); ((TextView) convertView).setText("" + position);
@@ -112,7 +174,25 @@ public class LinearLayoutManagerActivity extends Activity {
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mRecyclerView.scrollToPosition(position); 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 @Override
@@ -127,25 +207,28 @@ public class LinearLayoutManagerActivity extends Activity {
new ConfigToggle(R.string.checkbox_orientation) { new ConfigToggle(R.string.checkbox_orientation) {
@Override @Override
public boolean isChecked() { public boolean isChecked() {
return mListLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL; return mListWrapper.getOrientation() == LinearLayoutManager.HORIZONTAL;
} }
@Override @Override
public void onChange(boolean newValue) { public void onChange(boolean newValue) {
mListLayoutManager.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL mListWrapper.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
: LinearLayoutManager.VERTICAL); : LinearLayoutManager.VERTICAL);
mDividerItemDecoration.setOrientation(mListLayoutManager.getOrientation()); if (mDividerItemDecoration != null) {
mDividerItemDecoration.setOrientation(mListWrapper.getOrientation());
}
} }
}, },
new ConfigToggle(R.string.checkbox_reverse) { new ConfigToggle(R.string.checkbox_reverse) {
@Override @Override
public boolean isChecked() { public boolean isChecked() {
return mListLayoutManager.getReverseLayout(); return mListWrapper.getReverseLayout();
} }
@Override @Override
public void onChange(boolean newValue) { public void onChange(boolean newValue) {
mListLayoutManager.setReverseLayout(newValue); mListWrapper.setReverseLayout(newValue);
} }
}, },
new ConfigToggle(R.string.checkbox_layout_dir) { new ConfigToggle(R.string.checkbox_layout_dir) {
@@ -164,12 +247,12 @@ public class LinearLayoutManagerActivity extends Activity {
new ConfigToggle(R.string.checkbox_stack_from_end) { new ConfigToggle(R.string.checkbox_stack_from_end) {
@Override @Override
public boolean isChecked() { public boolean isChecked() {
return mListLayoutManager.getStackFromEnd(); return mListWrapper.getStackFromEnd();
} }
@Override @Override
public void onChange(boolean newValue) { public void onChange(boolean newValue) {
mListLayoutManager.setStackFromEnd(newValue); mListWrapper.setStackFromEnd(newValue);
} }
} }
}; };
@@ -221,7 +304,6 @@ public class LinearLayoutManagerActivity extends Activity {
} }
private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() { private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
@Override @Override
public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@@ -240,4 +322,25 @@ public class LinearLayoutManagerActivity extends Activity {
} }
}; };
/**
* 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);
}
} }

View File

@@ -17,9 +17,9 @@
package com.example.android.supportv7.widget.adapter; package com.example.android.supportv7.widget.adapter;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
@@ -34,16 +34,16 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
public static class ViewHolder extends RecyclerView.ViewHolder { public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView; public TextView mTextView;
public ViewHolder(TextView v) { public ViewHolder(TextView v) {
super(v); super(v);
textView = v; mTextView = v;
} }
@Override @Override
public String toString() { public String toString() {
return super.toString() + " '" + textView.getText(); return super.toString() + " '" + mTextView.getText();
} }
} }
@@ -69,16 +69,36 @@ public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapte
@Override @Override
public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final ViewHolder h = new ViewHolder(new TextView(parent.getContext())); final ViewHolder h = new ViewHolder(new TextView(parent.getContext()));
h.textView.setMinimumHeight(128); h.mTextView.setMinimumHeight(128);
h.textView.setPadding(20, 0, 20, 0); h.mTextView.setPadding(20, 0, 20, 0);
h.textView.setFocusable(true); h.mTextView.setFocusable(true);
h.textView.setBackgroundResource(mBackground); h.mTextView.setBackgroundResource(mBackground);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lp.leftMargin = 10;
lp.rightMargin = 5;
lp.topMargin = 20;
lp.bottomMargin = 15;
h.mTextView.setLayoutParams(lp);
return h; return h;
} }
@Override @Override
public void onBindViewHolder(ViewHolder holder, int position) { public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText(position + ":" + mValues.get(position)); holder.mTextView.setText(position + ":" + mValues.get(position));
holder.mTextView.setMinHeight((200 + mValues.get(position).length() * 10));
holder.mTextView.setBackgroundColor(getBackgroundColor(position));
}
private int getBackgroundColor(int position) {
switch (position % 4) {
case 0: return Color.BLACK;
case 1: return Color.RED;
case 2: return Color.GREEN;
case 3: return Color.BLUE;
}
return Color.TRANSPARENT;
} }
@Override @Override