diff --git a/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java index 2e286a1..1271821 100644 --- a/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java +++ b/library/src/main/java/com/eowise/recyclerview/stickyheaders/StickyHeadersItemDecoration.java @@ -53,7 +53,7 @@ public void onDrawOver(Canvas c, RecyclerView parent) { for (int i = childCount - 1; i >= 0; i--) { final View child = parent.getChildAt(i); final RecyclerView.ViewHolder itemViewHolder = parent.getChildViewHolder(child); - currentHeaderId = getHeaderId(itemViewHolder); + currentHeaderId = getHeaderId(itemViewHolder, itemViewHolder.getPosition()); if (i == 0 || !currentHeaderId.equals(getHeaderId(parent, i - 1))) { @@ -78,7 +78,7 @@ public void onDrawOver(Canvas c, RecyclerView parent) { @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { - if (itemPosition != 0 && getHeaderId(parent.findViewHolderForPosition(itemPosition)) == getHeaderId(parent.findViewHolderForPosition(itemPosition - 1))) { + if (itemPosition != 0 && getHeaderId(parent.findViewHolderForPosition(itemPosition), itemPosition) == getHeaderId(parent.findViewHolderForPosition(itemPosition - 1), itemPosition)) { outRect.set(0, 0, 0, 0); } else { @@ -125,15 +125,15 @@ private long getHeaderId(RecyclerView parent, int childPosition) { final View child = parent.getChildAt(childPosition); final RecyclerView.ViewHolder itemViewHolder = parent.getChildViewHolder(child); - return getHeaderId(itemViewHolder); + return getHeaderId(itemViewHolder, itemViewHolder.getPosition()); } - private long getHeaderId(RecyclerView.ViewHolder itemViewHolder) { - if (!headersIds.containsKey(itemViewHolder.getPosition())) { + private long getHeaderId(RecyclerView.ViewHolder itemViewHolder, int dataSetPosition) { + if (!headersIds.containsKey(dataSetPosition)) { headersIds.put(itemViewHolder.getPosition(), adapter.getHeaderId(itemViewHolder, itemViewHolder.getPosition())); } - return headersIds.get(itemViewHolder.getPosition()); + return headersIds.get(dataSetPosition); } } diff --git a/samples/build.gradle b/samples/build.gradle new file mode 100644 index 0000000..0563b2b --- /dev/null +++ b/samples/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' + + +dependencies { + compile project(':library') + compile 'com.android.support:recyclerview-v7:+' + compile 'com.android.support:appcompat-v7:20.+' +} + +android { + compileSdkVersion 'android-L' + buildToolsVersion '20.0.0' +} \ No newline at end of file diff --git a/samples/src/main/AndroidManifest.xml b/samples/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bc30a5c --- /dev/null +++ b/samples/src/main/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/MainActivity.java b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/MainActivity.java new file mode 100644 index 0000000..28dee07 --- /dev/null +++ b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/MainActivity.java @@ -0,0 +1,32 @@ +package com.eowise.recyclerview.stickyheaders.samples; + +import android.app.Activity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +import com.eowise.recyclerview.stickyheaders.HeaderPosition; +import com.eowise.recyclerview.stickyheaders.StickyHeadersItemDecoration; +import com.eowise.recyclerview.stickyheaders.samples.adapters.PersonAdapter; +import com.eowise.recyclerview.stickyheaders.samples.adapters.PersonInitialAdapter; + +/** + * Created by aurel on 22/09/14. + */ +public class MainActivity extends Activity { + + private RecyclerView list; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_main); + + list = (RecyclerView)findViewById(R.id.list); + + list.setAdapter(new PersonAdapter()); + list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); + list.addItemDecoration(new StickyHeadersItemDecoration(new PersonInitialAdapter(), list, HeaderPosition.OVERLAY)); + } +} diff --git a/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonAdapter.java b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonAdapter.java new file mode 100644 index 0000000..bc26843 --- /dev/null +++ b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonAdapter.java @@ -0,0 +1,246 @@ +package com.eowise.recyclerview.stickyheaders.samples.adapters; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.eowise.recyclerview.stickyheaders.samples.R; + +/** + * Created by aurel on 22/09/14. + */ +public class PersonAdapter extends RecyclerView.Adapter { + + String[] items = { + "Abram Tavernia", + "Alexa Oquin", + "Alvin Lainez", + "Alyce Rakestraw", + "Angel Scruggs", + "Annabel Wardle", + "Ardella Hollinger", + "Arlean Drewes", + "Armida Carasco", + "Asa Modeste", + "Ashlea Aguillard", + "Aurore Maris", + "Bao Godbold", + "Bettye Wenger", + "Bill Thatch", + "Brad Amis", + "Bridget Goulette", + "Bryan Rarick", + "Camie Malcolm", + "Caridad Nesbitt", + "Carleen Maul", + "Carmelo Ehrmann", + "Caroll Ruben", + "Cherryl Suter", + "Christeen Bonner", + "Christene Thrailkill", + "Cindie Luong", + "Claudio Llanos", + "Cleveland Selvage", + "Clint Cullen", + "Clora Graybeal", + "Cristin Culton", + "Crysta Bolt", + "Cuc Hetzel", + "Daine Cumbie", + "Danuta Villalta", + "Darci Quick", + "Darius Hermes", + "Delaine Evins", + "Delpha Godin", + "Dexter Bencomo", + "Dione Rhines", + "Donella Blumstein", + "Dorene Kisling", + "Dudley Benavides", + "Dulce Demille", + "Ebonie Wallis", + "Effie Wiley", + "Elayne Munro", + "Elisha Funches", + "Elna Padua", + "Emmy Denk", + "Farrah Delosantos", + "Frieda Buesing", + "Gilda Tse", + "Gina Dufault", + "Giovanna Schepis", + "Glayds Mcguigan", + "Glinda Dunagan", + "Gwenda Fraser", + "Hai Oday", + "Halley Holscher", + "Hellen Baillie", + "Herbert Renninger", + "Hobert Yopp", + "Hollis Haubert", + "Hui Lupien", + "Ileen Mccasland", + "Imelda Moser", + "Ione Littlewood", + "Jacalyn Gressett", + "Jacquelyn Butter", + "Jade Churchwell", + "Jami Selph", + "Janeth Ringwood", + "Jeffry Carcamo", + "Jerlene Zellers", + "Jerome Tomko", + "Jerrod Rother", + "Jettie Conner", + "Joaquin Keplinger", + "Joette Healey", + "Jorge Molina", + "Juana Olds", + "Jules Friley", + "Julio Krier", + "Kareen Bergey", + "Katharyn Doten", + "Katherine Ragsdale", + "Kathryn Edgington", + "Katia Hock", + "Keeley Pass", + "Kendrick Moncada", + "Kenyetta Wick", + "Kimber Boulware", + "Kitty Manthe", + "Kristan Blake", + "Lakeisha Medlin", + "Lakesha Voth", + "Lanora Pair", + "Lashon Abramson", + "Laurie Campa", + "Laurinda Barcus", + "Lavern Puig", + "Lera Mckibben", + "Long Show", + "Louanne Garling", + "Louella Petillo", + "Lucinda Sockwell", + "Lyla Fitzsimons", + "Mackenzie Ooten", + "Malia Claiborne", + "Manie Yarberry", + "Marchelle Halcomb", + "Marcie Augusta", + "Marguerita Tenaglia", + "Mari Sheperd", + "Mariela Ruggieri", + "Marielle Connolly", + "Marilyn Franck", + "Marisol Marmolejo", + "Marth Pitchford", + "Marty Cobey", + "Maximo Thornburg", + "Meggan Plumadore", + "Mellissa Schnitzer", + "Melodie Kitch", + "Mimi File", + "Mina Nolte", + "Mira Archuleta", + "Modesto Higgenbotham", + "Mohammed Orr", + "Morgan Maddy", + "Morgan Mensch", + "Moriah Grubb", + "Nedra Dyson", + "Norene Nelms", + "Odis Mill", + "Ok Hutter", + "Olin Bolander", + "Otilia Dejulio", + "Otis Shore", + "Patrina Crystal", + "Philip Wengert", + "Porter Ketner", + "Rhiannon Lavoie", + "Richard Domingues", + "Rochell Molock", + "Rosalva Gutman", + "Rosalyn Pesce", + "Rosaria Rosengarten", + "Roxane Clayborn", + "Rozanne Mahaney", + "Sal Wilkinson", + "Saundra Lundahl", + "Scotty Ralph", + "Seema Boots", + "Selena Eisenhower", + "Shae Hellard", + "Shae Latz", + "Shantay Wilcox", + "Shawnda Kees", + "Shayne Cutler", + "Shenita Cassette", + "Sherie Culp", + "Sherrie Poole", + "Shirley Cliett", + "Shizue Alcaraz", + "Sid Streets", + "Stacia Twellman", + "Stasia Slay", + "Stephen Eagles", + "Svetlana Hallam", + "Tambra Buchner", + "Tamie Branham", + "Tammera Hutt", + "Tawanna Rameriz", + "Tawna Seim", + "Terisa Whitbeck", + "Terresa Brantley", + "Terri Barnaby", + "Tinisha Gammill", + "Todd Netter", + "Toshiko Skowron", + "Traci Schurr", + "Trish Perino", + "Tyesha Bruemmer", + "Valda Skyles", + "Vella Montilla", + "Venita Richarson", + "Vera Noffsinger", + "Vinnie Gobeil", + "Waltraud Nelsen", + "Wendy Zachery", + "Willard Qualls", + "Willetta Zucker", + "Yen Staton", + "Yolonda Hadnott", + "Yoshie Califano", + "Yu Schilke" + }; + + @Override + public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false); + + return new ViewHolder(itemView); + + } + + @Override + public void onBindViewHolder(ViewHolder viewHolder, int position) { + viewHolder.label.setText(items[position]); + } + + @Override + public int getItemCount() { + return items.length; + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + TextView label; + + public ViewHolder(View itemView) { + super(itemView); + label = (TextView) itemView.findViewById(R.id.name); + } + } +} diff --git a/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonInitialAdapter.java b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonInitialAdapter.java new file mode 100644 index 0000000..7ef5d43 --- /dev/null +++ b/samples/src/main/java/com/eowise/recyclerview/stickyheaders/samples/adapters/PersonInitialAdapter.java @@ -0,0 +1,43 @@ +package com.eowise.recyclerview.stickyheaders.samples.adapters; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.eowise.recyclerview.stickyheaders.StickyHeadersAdapter; +import com.eowise.recyclerview.stickyheaders.samples.R; + +/** + * Created by aurel on 23/09/14. + */ +public class PersonInitialAdapter implements StickyHeadersAdapter { + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.letter_header, parent, false); + + return new ViewHolder(itemView); + } + + @Override + public void onBindViewHolder(ViewHolder headerViewHolder, PersonAdapter.ViewHolder itemViewHolder, int position) { + headerViewHolder.letter.setText(itemViewHolder.label.getText().subSequence(0, 1)); + } + + @Override + public long getHeaderId(PersonAdapter.ViewHolder viewHolder, int position) { + return viewHolder.label.getText().charAt(0); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + TextView letter; + + public ViewHolder(View itemView) { + super(itemView); + letter = (TextView) itemView.findViewById(R.id.letter); + } + } +} diff --git a/samples/src/main/res/drawable-hdpi/ic_launcher.png b/samples/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000..0e79b18 Binary files /dev/null and b/samples/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/samples/src/main/res/drawable-mdpi/ic_launcher.png b/samples/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000..1183441 Binary files /dev/null and b/samples/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/samples/src/main/res/drawable-xhdpi/ic_launcher.png b/samples/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000..c8ab2a1 Binary files /dev/null and b/samples/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/samples/src/main/res/layout/activity_main.xml b/samples/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..5f99315 --- /dev/null +++ b/samples/src/main/res/layout/activity_main.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/samples/src/main/res/layout/letter_header.xml b/samples/src/main/res/layout/letter_header.xml new file mode 100644 index 0000000..6af6fce --- /dev/null +++ b/samples/src/main/res/layout/letter_header.xml @@ -0,0 +1,12 @@ + + + + diff --git a/samples/src/main/res/layout/list_item.xml b/samples/src/main/res/layout/list_item.xml new file mode 100644 index 0000000..10ada46 --- /dev/null +++ b/samples/src/main/res/layout/list_item.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/samples/src/main/res/values/dimens.xml b/samples/src/main/res/values/dimens.xml new file mode 100644 index 0000000..93ba2ab --- /dev/null +++ b/samples/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 72dp + \ No newline at end of file diff --git a/samples/src/main/res/values/strings.xml b/samples/src/main/res/values/strings.xml new file mode 100644 index 0000000..5add872 --- /dev/null +++ b/samples/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Sticky headers Samples + \ No newline at end of file diff --git a/samples/src/main/res/values/styles.xml b/samples/src/main/res/values/styles.xml new file mode 100644 index 0000000..4dd4c5d --- /dev/null +++ b/samples/src/main/res/values/styles.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 64e1816..4c952a1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ -include 'library' \ No newline at end of file +include 'library' +include 'samples' \ No newline at end of file