18faffcd819c6272f9e6537d563c8492854787968Chris Craik/* 28faffcd819c6272f9e6537d563c8492854787968Chris Craik * Copyright (C) 2016 The Android Open Source Project 38faffcd819c6272f9e6537d563c8492854787968Chris Craik * 48faffcd819c6272f9e6537d563c8492854787968Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 58faffcd819c6272f9e6537d563c8492854787968Chris Craik * you may not use this file except in compliance with the License. 68faffcd819c6272f9e6537d563c8492854787968Chris Craik * You may obtain a copy of the License at 78faffcd819c6272f9e6537d563c8492854787968Chris Craik * 88faffcd819c6272f9e6537d563c8492854787968Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 98faffcd819c6272f9e6537d563c8492854787968Chris Craik * 108faffcd819c6272f9e6537d563c8492854787968Chris Craik * Unless required by applicable law or agreed to in writing, software 118faffcd819c6272f9e6537d563c8492854787968Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 128faffcd819c6272f9e6537d563c8492854787968Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138faffcd819c6272f9e6537d563c8492854787968Chris Craik * See the License for the specific language governing permissions and 148faffcd819c6272f9e6537d563c8492854787968Chris Craik * limitations under the License. 158faffcd819c6272f9e6537d563c8492854787968Chris Craik */ 168faffcd819c6272f9e6537d563c8492854787968Chris Craik 178faffcd819c6272f9e6537d563c8492854787968Chris Craikpackage com.example.android.supportv7.widget; 188faffcd819c6272f9e6537d563c8492854787968Chris Craik 198faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.graphics.Color; 208faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.support.v7.widget.DividerItemDecoration; 218faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.support.v7.widget.LinearLayoutManager; 228faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.support.v7.widget.RecyclerView; 238faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.view.LayoutInflater; 248faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.view.ViewGroup; 258faffcd819c6272f9e6537d563c8492854787968Chris Craikimport android.widget.TextView; 268faffcd819c6272f9e6537d563c8492854787968Chris Craik 278faffcd819c6272f9e6537d563c8492854787968Chris Craikimport com.example.android.supportv7.Cheeses; 288faffcd819c6272f9e6537d563c8492854787968Chris Craikimport com.example.android.supportv7.R; 298faffcd819c6272f9e6537d563c8492854787968Chris Craik 308faffcd819c6272f9e6537d563c8492854787968Chris Craikimport java.util.ArrayList; 318faffcd819c6272f9e6537d563c8492854787968Chris Craikimport java.util.Arrays; 328faffcd819c6272f9e6537d563c8492854787968Chris Craik 338faffcd819c6272f9e6537d563c8492854787968Chris Craik/** 348faffcd819c6272f9e6537d563c8492854787968Chris Craik * A sample nested RecyclerView activity. 358faffcd819c6272f9e6537d563c8492854787968Chris Craik */ 368faffcd819c6272f9e6537d563c8492854787968Chris Craikpublic class NestedRecyclerViewActivity extends BaseLayoutManagerActivity<LinearLayoutManager> { 378faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 388faffcd819c6272f9e6537d563c8492854787968Chris Craik protected LinearLayoutManager createLayoutManager() { 398faffcd819c6272f9e6537d563c8492854787968Chris Craik return new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 408faffcd819c6272f9e6537d563c8492854787968Chris Craik } 418faffcd819c6272f9e6537d563c8492854787968Chris Craik 428faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 438faffcd819c6272f9e6537d563c8492854787968Chris Craik protected void onRecyclerViewInit(RecyclerView recyclerView) { 448faffcd819c6272f9e6537d563c8492854787968Chris Craik recyclerView.addItemDecoration( 458faffcd819c6272f9e6537d563c8492854787968Chris Craik new DividerItemDecoration(this, mLayoutManager.getOrientation())); 468faffcd819c6272f9e6537d563c8492854787968Chris Craik } 478faffcd819c6272f9e6537d563c8492854787968Chris Craik 488faffcd819c6272f9e6537d563c8492854787968Chris Craik static class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> { 498faffcd819c6272f9e6537d563c8492854787968Chris Craik public static class ViewHolder extends RecyclerView.ViewHolder { 508faffcd819c6272f9e6537d563c8492854787968Chris Craik public TextView mTextView; 518faffcd819c6272f9e6537d563c8492854787968Chris Craik 528faffcd819c6272f9e6537d563c8492854787968Chris Craik public ViewHolder(TextView itemView) { 538faffcd819c6272f9e6537d563c8492854787968Chris Craik super(itemView); 548faffcd819c6272f9e6537d563c8492854787968Chris Craik mTextView = itemView; 558faffcd819c6272f9e6537d563c8492854787968Chris Craik } 568faffcd819c6272f9e6537d563c8492854787968Chris Craik } 578faffcd819c6272f9e6537d563c8492854787968Chris Craik 588faffcd819c6272f9e6537d563c8492854787968Chris Craik private String[] mData; 598faffcd819c6272f9e6537d563c8492854787968Chris Craik 608faffcd819c6272f9e6537d563c8492854787968Chris Craik public InnerAdapter(String[] data) { 618faffcd819c6272f9e6537d563c8492854787968Chris Craik mData = data; 628faffcd819c6272f9e6537d563c8492854787968Chris Craik } 638faffcd819c6272f9e6537d563c8492854787968Chris Craik 648faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 658faffcd819c6272f9e6537d563c8492854787968Chris Craik public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 668faffcd819c6272f9e6537d563c8492854787968Chris Craik LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 678faffcd819c6272f9e6537d563c8492854787968Chris Craik TextView textView = (TextView) inflater.inflate(R.layout.nested_item, parent, false); 688faffcd819c6272f9e6537d563c8492854787968Chris Craik textView.setMinimumWidth(300); 698faffcd819c6272f9e6537d563c8492854787968Chris Craik textView.setMinimumHeight(300); 708faffcd819c6272f9e6537d563c8492854787968Chris Craik return new ViewHolder(textView); 718faffcd819c6272f9e6537d563c8492854787968Chris Craik } 728faffcd819c6272f9e6537d563c8492854787968Chris Craik 738faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 748faffcd819c6272f9e6537d563c8492854787968Chris Craik public void onBindViewHolder(ViewHolder holder, int position) { 758faffcd819c6272f9e6537d563c8492854787968Chris Craik holder.mTextView.setText(mData[position]); 768faffcd819c6272f9e6537d563c8492854787968Chris Craik boolean even = position % 2 == 0; 778faffcd819c6272f9e6537d563c8492854787968Chris Craik holder.mTextView.setBackgroundColor(even ? Color.TRANSPARENT : 0x2fffffff); 788faffcd819c6272f9e6537d563c8492854787968Chris Craik } 798faffcd819c6272f9e6537d563c8492854787968Chris Craik 808faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 818faffcd819c6272f9e6537d563c8492854787968Chris Craik public int getItemCount() { 828faffcd819c6272f9e6537d563c8492854787968Chris Craik return mData.length; 838faffcd819c6272f9e6537d563c8492854787968Chris Craik } 848faffcd819c6272f9e6537d563c8492854787968Chris Craik } 858faffcd819c6272f9e6537d563c8492854787968Chris Craik 868faffcd819c6272f9e6537d563c8492854787968Chris Craik static class OuterAdapter extends RecyclerView.Adapter<OuterAdapter.ViewHolder> { 878faffcd819c6272f9e6537d563c8492854787968Chris Craik public static class ViewHolder extends RecyclerView.ViewHolder { 888faffcd819c6272f9e6537d563c8492854787968Chris Craik private final RecyclerView mRecyclerView; 898faffcd819c6272f9e6537d563c8492854787968Chris Craik public ViewHolder(RecyclerView itemView) { 908faffcd819c6272f9e6537d563c8492854787968Chris Craik super(itemView); 918faffcd819c6272f9e6537d563c8492854787968Chris Craik mRecyclerView = itemView; 928faffcd819c6272f9e6537d563c8492854787968Chris Craik } 938faffcd819c6272f9e6537d563c8492854787968Chris Craik } 948faffcd819c6272f9e6537d563c8492854787968Chris Craik 958faffcd819c6272f9e6537d563c8492854787968Chris Craik ArrayList<InnerAdapter> mAdapters = new ArrayList<>(); 968faffcd819c6272f9e6537d563c8492854787968Chris Craik RecyclerView.RecycledViewPool mSharedPool = new RecyclerView.RecycledViewPool(); 978faffcd819c6272f9e6537d563c8492854787968Chris Craik 988faffcd819c6272f9e6537d563c8492854787968Chris Craik public OuterAdapter(String[] data) { 998faffcd819c6272f9e6537d563c8492854787968Chris Craik int currentCharIndex = 0; 1008faffcd819c6272f9e6537d563c8492854787968Chris Craik char currentChar = data[0].charAt(0); 1018faffcd819c6272f9e6537d563c8492854787968Chris Craik for (int i = 1; i <= data.length; i++) { 1028faffcd819c6272f9e6537d563c8492854787968Chris Craik if (i == data.length || data[i].charAt(0) != currentChar) { 1038faffcd819c6272f9e6537d563c8492854787968Chris Craik mAdapters.add(new InnerAdapter( 1048faffcd819c6272f9e6537d563c8492854787968Chris Craik Arrays.copyOfRange(data, currentCharIndex, i - 1))); 1058faffcd819c6272f9e6537d563c8492854787968Chris Craik if (i < data.length) { 1068faffcd819c6272f9e6537d563c8492854787968Chris Craik currentChar = data[i].charAt(0); 1078faffcd819c6272f9e6537d563c8492854787968Chris Craik currentCharIndex = i; 1088faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1098faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1108faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1118faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1128faffcd819c6272f9e6537d563c8492854787968Chris Craik 1138faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 1148faffcd819c6272f9e6537d563c8492854787968Chris Craik public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 1158faffcd819c6272f9e6537d563c8492854787968Chris Craik RecyclerView rv = new RecyclerView(parent.getContext()); 1168faffcd819c6272f9e6537d563c8492854787968Chris Craik rv.setLayoutManager(new LinearLayoutManager(parent.getContext(), 1178faffcd819c6272f9e6537d563c8492854787968Chris Craik LinearLayoutManager.HORIZONTAL, false)); 1188faffcd819c6272f9e6537d563c8492854787968Chris Craik rv.setRecycledViewPool(mSharedPool); 1198faffcd819c6272f9e6537d563c8492854787968Chris Craik return new ViewHolder(rv); 1208faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1218faffcd819c6272f9e6537d563c8492854787968Chris Craik 1228faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 1238faffcd819c6272f9e6537d563c8492854787968Chris Craik public void onBindViewHolder(ViewHolder holder, int position) { 1248faffcd819c6272f9e6537d563c8492854787968Chris Craik holder.mRecyclerView.setAdapter(mAdapters.get(position)); 1258faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1268faffcd819c6272f9e6537d563c8492854787968Chris Craik 1278faffcd819c6272f9e6537d563c8492854787968Chris Craik @Override 1288faffcd819c6272f9e6537d563c8492854787968Chris Craik public int getItemCount() { 1298faffcd819c6272f9e6537d563c8492854787968Chris Craik return mAdapters.size(); 1308faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1318faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1328faffcd819c6272f9e6537d563c8492854787968Chris Craik 1338faffcd819c6272f9e6537d563c8492854787968Chris Craik protected RecyclerView.Adapter createAdapter() { 1348faffcd819c6272f9e6537d563c8492854787968Chris Craik return new OuterAdapter(Cheeses.sCheeseStrings); 1358faffcd819c6272f9e6537d563c8492854787968Chris Craik } 1368faffcd819c6272f9e6537d563c8492854787968Chris Craik} 137