Skip to content

Commit 6e4c7a0

Browse files
committed
Added viewTypes to the header adapters
1 parent 4a92db5 commit 6e4c7a0

File tree

6 files changed

+104
-43
lines changed

6 files changed

+104
-43
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ The latest AAR (Android Archive) files can be downloaded from JCenter [RecyclerE
2323
Or included in your gradle dependencies
2424

2525
```groovy
26-
compile 'com.devbrackets.android:recyclerext:0.12.4'
26+
compile 'com.devbrackets.android:recyclerext:0.13.0'
2727
```
2828

2929

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/fragment/HeaderListFragment.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.support.v4.app.Fragment;
66
import android.support.v7.widget.LinearLayoutManager;
77
import android.support.v7.widget.RecyclerView;
8+
import android.util.Log;
89
import android.view.LayoutInflater;
910
import android.view.View;
1011
import android.view.ViewGroup;
@@ -75,13 +76,13 @@ public HeaderAdapter(Context context, List<ItemDAO> items) {
7576
}
7677

7778
@Override
78-
public SimpleTextViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
79+
public SimpleTextViewHolder onCreateHeaderViewHolder(ViewGroup parent, int viewType) {
7980
View view = inflater.inflate(R.layout.simple_text_item, parent, false);
8081
return new SimpleTextViewHolder(view);
8182
}
8283

8384
@Override
84-
public SimpleTextViewHolder onCreateChildViewHolder(ViewGroup parent) {
85+
public SimpleTextViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
8586
View view = inflater.inflate(R.layout.simple_text_item, parent, false);
8687
return new SimpleTextViewHolder(view);
8788
}

library/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ apply plugin: 'maven'
33
apply plugin: 'bintray-release'
44

55
def versionMajor = 0
6-
def versionMinor = 12
7-
def versionPatch = 4
6+
def versionMinor = 13
7+
def versionPatch = 0
88

99
// Maven GAV
1010
def libraryGroupId = 'com.devbrackets.android'

library/src/main/java/com/devbrackets/android/recyclerext/adapter/RecyclerHeaderAdapter.java

+44-17
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@
3535
* @param <C> The Child or content {@link RecyclerView.ViewHolder}
3636
*/
3737
public abstract class RecyclerHeaderAdapter<H extends ViewHolder, C extends ViewHolder> extends RecyclerView.Adapter<ViewHolder> {
38-
public static final int VIEW_TYPE_CHILD = 1;
39-
public static final int VIEW_TYPE_HEADER = 10;
38+
public static final int HEADER_VIEW_TYPE_MASK = 0x80000000;
4039

4140
private Observer observer = new Observer();
4241
protected Map<Long, Integer> headerChildCountMap = new HashMap<>();
@@ -46,17 +45,19 @@ public abstract class RecyclerHeaderAdapter<H extends ViewHolder, C extends View
4645
* Called when the RecyclerView needs a new {@link H} ViewHolder
4746
*
4847
* @param parent The ViewGroup into which the new View will be added
48+
* @param viewType The type for the header view
4949
* @return The view type of the new View
5050
*/
51-
public abstract H onCreateHeaderViewHolder(ViewGroup parent);
51+
public abstract H onCreateHeaderViewHolder(ViewGroup parent, int viewType);
5252

5353
/**
5454
* Called when the RecyclerView needs a new {@link C} ViewHolder
5555
*
5656
* @param parent The ViewGroup into which the new View will be added
57+
* @param viewType The type for the child view
5758
* @return The view type of the new View
5859
*/
59-
public abstract C onCreateChildViewHolder(ViewGroup parent);
60+
public abstract C onCreateChildViewHolder(ViewGroup parent, int viewType);
6061

6162
/**
6263
* Called to display the header information with the <code>firstChildPosition</code> being the
@@ -85,22 +86,20 @@ public abstract class RecyclerHeaderAdapter<H extends ViewHolder, C extends View
8586

8687
/**
8788
* This method shouldn't be used directly, instead use
88-
* {@link #onCreateHeaderViewHolder(ViewGroup)} and
89-
* {@link #onCreateChildViewHolder(ViewGroup)}
89+
* {@link #onCreateHeaderViewHolder(ViewGroup, int)} and
90+
* {@link #onCreateChildViewHolder(ViewGroup, int)}
9091
*
9192
* @param parent The parent ViewGroup for the ViewHolder
9293
* @param viewType The type for the ViewHolder
9394
* @return The correct ViewHolder for the specified viewType
9495
*/
9596
@Override
9697
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
97-
if (viewType == VIEW_TYPE_CHILD) {
98-
return onCreateChildViewHolder(parent);
99-
} else if (viewType == VIEW_TYPE_HEADER) {
100-
return onCreateHeaderViewHolder(parent);
98+
if ((viewType & HEADER_VIEW_TYPE_MASK) != 0) {
99+
return onCreateHeaderViewHolder(parent, viewType);
101100
}
102101

103-
return null;
102+
return onCreateChildViewHolder(parent, viewType);
104103
}
105104

106105
/**
@@ -117,13 +116,14 @@ public void onBindViewHolder(ViewHolder holder, int position) {
117116
int viewType = getItemViewType(position);
118117
int childPosition = determineChildPosition(position);
119118

120-
if (viewType == VIEW_TYPE_CHILD) {
121-
onBindChildViewHolder((C) holder, childPosition);
122-
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
123-
} else if (viewType == VIEW_TYPE_HEADER) {
119+
if ((viewType & HEADER_VIEW_TYPE_MASK) != 0) {
124120
onBindHeaderViewHolder((H) holder, childPosition);
125121
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
122+
return;
126123
}
124+
125+
onBindChildViewHolder((C) holder, childPosition);
126+
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
127127
}
128128

129129
/**
@@ -134,15 +134,42 @@ public void onBindViewHolder(ViewHolder holder, int position) {
134134
*/
135135
@Override
136136
public int getItemViewType(int position) {
137+
int childPosition = determineChildPosition(position);
138+
137139
for (HeaderItem item : headerItems) {
138140
if (item.getViewPosition() == position) {
139-
return VIEW_TYPE_HEADER;
141+
return getHeaderViewType(childPosition) | HEADER_VIEW_TYPE_MASK;
140142
} else if (item.getViewPosition() > position) {
141143
break;
142144
}
143145
}
144146

145-
return VIEW_TYPE_CHILD;
147+
return getChildViewType(childPosition) & ~HEADER_VIEW_TYPE_MASK;
148+
}
149+
150+
/**
151+
* Retrieves the view type for the header whos first child view
152+
* has the <code>childPosition</code>. This value will be |'d with
153+
* the {@link #HEADER_VIEW_TYPE_MASK} to make sure the header and child
154+
* view types don't overlap
155+
*
156+
* @param childPosition The position for the fist child underneath the header
157+
* @return The view type for the header view
158+
*/
159+
public int getHeaderViewType(int childPosition) {
160+
return 0;
161+
}
162+
163+
/**
164+
* Retrieves the view type for the child view at the specified
165+
* <code>childPosition</code>. This value will be &'ed with the
166+
* inverse of {@link #HEADER_VIEW_TYPE_MASK} to make sure the header
167+
* and child view types don't overlap.
168+
* @param childPosition The position of the child to get the type for
169+
* @return The view type for the child view
170+
*/
171+
public int getChildViewType(int childPosition) {
172+
return 0;
146173
}
147174

148175
/**

library/src/main/java/com/devbrackets/android/recyclerext/adapter/RecyclerHeaderCursorAdapter.java

+45-18
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737
* @param <C> The Child or content {@link ViewHolder}
3838
*/
3939
public abstract class RecyclerHeaderCursorAdapter<H extends ViewHolder, C extends ViewHolder> extends RecyclerCursorAdapter<ViewHolder> {
40-
public static final int VIEW_TYPE_CHILD = 1;
41-
public static final int VIEW_TYPE_HEADER = 10;
40+
public static final int HEADER_VIEW_TYPE_MASK = 0x80000000;
4241

4342
private Observer observer = new Observer();
4443
protected Map<Long, Integer> headerChildCountMap = new HashMap<>();
@@ -48,17 +47,19 @@ public abstract class RecyclerHeaderCursorAdapter<H extends ViewHolder, C extend
4847
* Called when the RecyclerView needs a new {@link H} ViewHolder
4948
*
5049
* @param parent The ViewGroup into which the new View will be added
50+
* @param viewType The type for the header view
5151
* @return The view type of the new View
5252
*/
53-
public abstract H onCreateHeaderViewHolder(ViewGroup parent);
53+
public abstract H onCreateHeaderViewHolder(ViewGroup parent, int viewType);
5454

5555
/**
5656
* Called when the RecyclerView needs a new {@link C} ViewHolder
5757
*
5858
* @param parent The ViewGroup into which the new View will be added
59+
* @param viewType The type for the child view
5960
* @return The view type of the new View
6061
*/
61-
public abstract C onCreateChildViewHolder(ViewGroup parent);
62+
public abstract C onCreateChildViewHolder(ViewGroup parent, int viewType);
6263

6364
/**
6465
* Called to display the header information with the <code>firstChildPosition</code> being the
@@ -97,22 +98,20 @@ public RecyclerHeaderCursorAdapter(Cursor cursor, String idColumnName) {
9798

9899
/**
99100
* This method shouldn't be used directly, instead use
100-
* {@link #onCreateHeaderViewHolder(ViewGroup)} and
101-
* {@link #onCreateChildViewHolder(ViewGroup)}
101+
* {@link #onCreateHeaderViewHolder(ViewGroup, int)} and
102+
* {@link #onCreateChildViewHolder(ViewGroup, int)}
102103
*
103104
* @param parent The parent ViewGroup for the ViewHolder
104105
* @param viewType The type for the ViewHolder
105106
* @return The correct ViewHolder for the specified viewType
106107
*/
107108
@Override
108109
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
109-
if (viewType == VIEW_TYPE_CHILD) {
110-
return onCreateChildViewHolder(parent);
111-
} else if (viewType == VIEW_TYPE_HEADER) {
112-
return onCreateHeaderViewHolder(parent);
110+
if ((viewType & HEADER_VIEW_TYPE_MASK) != 0) {
111+
return onCreateHeaderViewHolder(parent, viewType);
113112
}
114113

115-
return null;
114+
return onCreateChildViewHolder(parent, viewType);
116115
}
117116

118117
/**
@@ -129,15 +128,16 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
129128
public void onBindViewHolder(ViewHolder holder, Cursor cursor, int position) {
130129
int viewType = getItemViewType(position);
131130
int childPosition = determineChildPosition(position);
132-
133131
Cursor c = getCursor(childPosition);
134-
if (viewType == VIEW_TYPE_CHILD) {
135-
onBindChildViewHolder((C) holder, c, childPosition);
136-
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
137-
} else if (viewType == VIEW_TYPE_HEADER) {
132+
133+
if ((viewType & HEADER_VIEW_TYPE_MASK) != 0) {
138134
onBindHeaderViewHolder((H) holder, c, childPosition);
139135
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
136+
return;
140137
}
138+
139+
onBindChildViewHolder((C) holder, c, childPosition);
140+
holder.itemView.setTag(R.id.recyclerext_view_child_position, childPosition);
141141
}
142142

143143
/**
@@ -148,15 +148,42 @@ public void onBindViewHolder(ViewHolder holder, Cursor cursor, int position) {
148148
*/
149149
@Override
150150
public int getItemViewType(int position) {
151+
int childPosition = determineChildPosition(position);
152+
151153
for (HeaderItem item : headerItems) {
152154
if (item.getViewPosition() == position) {
153-
return VIEW_TYPE_HEADER;
155+
return getHeaderViewType(childPosition) | HEADER_VIEW_TYPE_MASK;
154156
} else if (item.getViewPosition() > position) {
155157
break;
156158
}
157159
}
158160

159-
return VIEW_TYPE_CHILD;
161+
return getChildViewType(childPosition) & ~HEADER_VIEW_TYPE_MASK;
162+
}
163+
164+
/**
165+
* Retrieves the view type for the header whos first child view
166+
* has the <code>childPosition</code>. This value will be |'d with
167+
* the {@link #HEADER_VIEW_TYPE_MASK} to make sure the header and child
168+
* view types don't overlap
169+
*
170+
* @param childPosition The position for the fist child underneath the header
171+
* @return The view type for the header view
172+
*/
173+
public int getHeaderViewType(int childPosition) {
174+
return 0;
175+
}
176+
177+
/**
178+
* Retrieves the view type for the child view at the specified
179+
* <code>childPosition</code>. This value will be &'ed with the
180+
* inverse of {@link #HEADER_VIEW_TYPE_MASK} to make sure the header
181+
* and child view types don't overlap.
182+
* @param childPosition The position of the child to get the type for
183+
* @return The view type for the child view
184+
*/
185+
public int getChildViewType(int childPosition) {
186+
return 0;
160187
}
161188

162189
/**

library/src/main/java/com/devbrackets/android/recyclerext/decoration/StickyHeaderDecoration.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,14 @@ private int getHeaderPosition(RecyclerView.Adapter headerAdapter, long headerId)
306306
return RecyclerView.NO_POSITION;
307307
}
308308

309+
private int getHeaderViewType(int headerPosition) {
310+
if (adapter instanceof RecyclerHeaderAdapter) {
311+
return ((RecyclerHeaderAdapter)adapter).determineChildPosition(headerPosition);
312+
}
313+
314+
return ((RecyclerHeaderCursorAdapter)adapter).determineChildPosition(headerPosition);
315+
}
316+
309317
/**
310318
* Retrieves the ViewHolder associated with the header at <code>headerPosition</code>.
311319
* If the ViewHolder returned from <code>parent</code> is null then a temporary ViewHolder
@@ -324,9 +332,7 @@ private RecyclerView.ViewHolder getHeaderViewHolder(int headerPosition) {
324332
}
325333

326334
//Otherwise try to create a temporary one
327-
if (fallbackHolder == null) {
328-
fallbackHolder = adapter.onCreateViewHolder(parent, RecyclerHeaderAdapter.VIEW_TYPE_HEADER);
329-
}
335+
fallbackHolder = adapter.onCreateViewHolder(parent, getHeaderViewType(headerPosition));
330336

331337
//Measure it
332338
if (!measureViewHolder(fallbackHolder)) {

0 commit comments

Comments
 (0)