diff options
Diffstat (limited to 'samples/browseable/RecyclerView/src/com.example.android.recyclerview')
2 files changed, 101 insertions, 15 deletions
diff --git a/samples/browseable/RecyclerView/src/com.example.android.recyclerview/CustomAdapter.java b/samples/browseable/RecyclerView/src/com.example.android.recyclerview/CustomAdapter.java index f8e3baecf..40f937541 100644 --- a/samples/browseable/RecyclerView/src/com.example.android.recyclerview/CustomAdapter.java +++ b/samples/browseable/RecyclerView/src/com.example.android.recyclerview/CustomAdapter.java @@ -34,21 +34,29 @@ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder // BEGIN_INCLUDE(recyclerViewSampleViewHolder) /** - * Provide a reference to the type of views that you are using (custom viewholder) + * Provide a reference to the type of views that you are using (custom ViewHolder) */ public static class ViewHolder extends RecyclerView.ViewHolder { - private final TextView mTextView; + private final TextView textView; public ViewHolder(View v) { super(v); - mTextView = (TextView) v.findViewById(R.id.textView); + // Define click listener for the ViewHolder's View. + v.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "Element " + getPosition() + " clicked."); + } + }); + textView = (TextView) v.findViewById(R.id.textView); } - public TextView getmTextView() { - return mTextView; + public TextView getTextView() { + return textView; } } // END_INCLUDE(recyclerViewSampleViewHolder) + /** * Initialize the dataset of the Adapter. * @@ -61,25 +69,24 @@ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder // BEGIN_INCLUDE(recyclerViewOnCreateViewHolder) // Create new views (invoked by the layout manager) @Override - public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { + public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { // Create a new view. View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.text_row_item, viewGroup, false); - ViewHolder vh = new ViewHolder(v); - return vh; + return new ViewHolder(v); } // END_INCLUDE(recyclerViewOnCreateViewHolder) // BEGIN_INCLUDE(recyclerViewOnBindViewHolder) // Replace the contents of a view (invoked by the layout manager) @Override - public void onBindViewHolder(ViewHolder viewHolder, int position) { + public void onBindViewHolder(ViewHolder viewHolder, final int position) { Log.d(TAG, "Element " + position + " set."); // Get element from your dataset at this position and replace the contents of the view // with that element - viewHolder.getmTextView().setText(mDataSet[position]); + viewHolder.getTextView().setText(mDataSet[position]); } // END_INCLUDE(recyclerViewOnBindViewHolder) diff --git a/samples/browseable/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.java b/samples/browseable/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.java index 4f4a5966a..019657ffb 100644 --- a/samples/browseable/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.java +++ b/samples/browseable/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.java @@ -18,21 +18,37 @@ package com.example.android.recyclerview; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v7.widget.GridLayoutManager; 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.RadioButton; /** - * Demonstrates the use of RecyclerView with a LinearLayoutManager. + * Demonstrates the use of {@link RecyclerView} with a {@link LinearLayoutManager} and a + * {@link GridLayoutManager}. */ public class RecyclerViewFragment extends Fragment { private static final String TAG = "RecyclerViewFragment"; + private static final String KEY_LAYOUT_MANAGER = "layoutManager"; + private static final int SPAN_COUNT = 2; + private static final int DATASET_COUNT = 60; + + private enum LayoutManagerType { + GRID_LAYOUT_MANAGER, + LINEAR_LAYOUT_MANAGER + } + + protected LayoutManagerType mCurrentLayoutManagerType; + + protected RadioButton mLinearLayoutRadioButton; + protected RadioButton mGridLayoutRadioButton; protected RecyclerView mRecyclerView; - protected RecyclerView.Adapter mAdapter; + protected CustomAdapter mAdapter; protected RecyclerView.LayoutManager mLayoutManager; protected String[] mDataset; @@ -58,23 +74,86 @@ public class RecyclerViewFragment extends Fragment { // to the way ListView would layout elements. The RecyclerView.LayoutManager defines how // elements are laid out. mLayoutManager = new LinearLayoutManager(getActivity()); - mRecyclerView.setLayoutManager(mLayoutManager); + + mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER; + + if (savedInstanceState != null) { + // Restore saved layout manager type. + mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState + .getSerializable(LAYOUT_MANAGER_KEY); + } + setRecyclerViewLayoutManager(mCurrentLayoutManagerType); mAdapter = new CustomAdapter(mDataset); // Set CustomAdapter as the adapter for RecyclerView. mRecyclerView.setAdapter(mAdapter); // END_INCLUDE(initializeRecyclerView) + mLinearLayoutRadioButton = (RadioButton) rootView.findViewById(R.id.linear_layout_rb); + mLinearLayoutRadioButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setRecyclerViewLayoutManager(LayoutManagerType.LINEAR_LAYOUT_MANAGER); + } + }); + + mGridLayoutRadioButton = (RadioButton) rootView.findViewById(R.id.grid_layout_rb); + mGridLayoutRadioButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setRecyclerViewLayoutManager(LayoutManagerType.GRID_LAYOUT_MANAGER); + } + }); + return rootView; } /** + * Set RecyclerView's LayoutManager to the one given. + * + * @param layoutManagerType Type of layout manager to switch to. + */ + public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) { + int scrollPosition = 0; + + // If a layout manager has already been set, get current scroll position. + if (mRecyclerView.getLayoutManager() != null) { + scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()) + .findFirstCompletelyVisibleItemPosition(); + } + + switch (layoutManagerType) { + case GRID_LAYOUT_MANAGER: + mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT); + mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER; + break; + case LINEAR_LAYOUT_MANAGER: + mLayoutManager = new LinearLayoutManager(getActivity()); + mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER; + break; + default: + mLayoutManager = new LinearLayoutManager(getActivity()); + mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER; + } + + mRecyclerView.setLayoutManager(mLayoutManager); + mRecyclerView.scrollToPosition(scrollPosition); + } + + @Override + public void onSaveInstanceState(Bundle savedInstanceState) { + // Save currently selected layout manager. + savedInstanceState.putSerializable(LAYOUT_MANAGER_KEY, mCurrentLayoutManagerType); + super.onSaveInstanceState(savedInstanceState); + } + + /** * Generates Strings for RecyclerView's adapter. This data would usually come * from a local content provider or remote server. */ private void initDataset() { - mDataset = new String[60]; - for (int i=0; i < 60; i++) { + mDataset = new String[DATASET_COUNT]; + for (int i = 0; i < DATASET_COUNT; i++) { mDataset[i] = "This is element #" + i; } } |