1
+ /*
2
+ * Copyright (C) 2016 Haruki Hasegawa
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ package com .h6ah4i .android .example .advrecyclerview .common .adapter ;
17
+
18
+ import android .support .v7 .widget .GridLayoutManager ;
19
+ import android .support .v7 .widget .RecyclerView ;
20
+ import android .support .v7 .widget .StaggeredGridLayoutManager ;
21
+ import android .view .LayoutInflater ;
22
+ import android .view .View ;
23
+ import android .view .ViewGroup ;
24
+
25
+ import com .h6ah4i .android .example .advrecyclerview .R ;
26
+ import com .h6ah4i .android .widget .advrecyclerview .headerfooter .AbstractHeaderFooterWrapperAdapter ;
27
+ import com .h6ah4i .android .widget .advrecyclerview .utils .RecyclerViewAdapterUtils ;
28
+ import com .h6ah4i .android .widget .advrecyclerview .utils .WrapperAdapterUtils ;
29
+
30
+ import java .util .List ;
31
+
32
+ public class DemoHeaderFooterAdapter
33
+ extends AbstractHeaderFooterWrapperAdapter <DemoHeaderFooterAdapter .HeaderViewHolder , DemoHeaderFooterAdapter .FooterViewHolder >
34
+ implements View .OnClickListener {
35
+ OnListItemClickMessageListener mOnItemClickListener ;
36
+
37
+ static class HeaderViewHolder extends RecyclerView .ViewHolder {
38
+ public HeaderViewHolder (View itemView ) {
39
+ super (itemView );
40
+ }
41
+ }
42
+
43
+ static class FooterViewHolder extends RecyclerView .ViewHolder {
44
+ public FooterViewHolder (View itemView ) {
45
+ super (itemView );
46
+ }
47
+ }
48
+
49
+ public DemoHeaderFooterAdapter (RecyclerView .Adapter adapter ) {
50
+ this (adapter , null );
51
+ }
52
+
53
+ public DemoHeaderFooterAdapter (RecyclerView .Adapter adapter , OnListItemClickMessageListener clickListener ) {
54
+ setAdapter (adapter );
55
+ mOnItemClickListener = clickListener ;
56
+ }
57
+
58
+ @ Override
59
+ public int getHeaderItemCount () {
60
+ return 1 ;
61
+ }
62
+
63
+ @ Override
64
+ public int getFooterItemCount () {
65
+ return 1 ;
66
+ }
67
+
68
+ @ Override
69
+ public HeaderViewHolder onCreateHeaderItemViewHolder (ViewGroup parent , int viewType ) {
70
+ View v = LayoutInflater .from (parent .getContext ()).inflate (R .layout .header_item , parent , false );
71
+ HeaderViewHolder vh = new HeaderViewHolder (v );
72
+ if (mOnItemClickListener != null ) {
73
+ vh .itemView .setOnClickListener (this );
74
+ }
75
+ return vh ;
76
+ }
77
+
78
+ @ Override
79
+ public FooterViewHolder onCreateFooterItemViewHolder (ViewGroup parent , int viewType ) {
80
+ View v = LayoutInflater .from (parent .getContext ()).inflate (R .layout .footer_item , parent , false );
81
+ FooterViewHolder vh = new FooterViewHolder (v );
82
+ if (mOnItemClickListener != null ) {
83
+ vh .itemView .setOnClickListener (this );
84
+ }
85
+ return vh ;
86
+ }
87
+
88
+ @ Override
89
+ public void onClick (View v ) {
90
+ RecyclerView rv = RecyclerViewAdapterUtils .getParentRecyclerView (v );
91
+ RecyclerView .ViewHolder vh = rv .findContainingViewHolder (v );
92
+
93
+ int rootPosition = vh .getAdapterPosition ();
94
+ if (rootPosition == RecyclerView .NO_POSITION ) {
95
+ return ;
96
+ }
97
+
98
+ // need to determine adapter local position like this:
99
+ RecyclerView .Adapter rootAdapter = rv .getAdapter ();
100
+ int localPosition = WrapperAdapterUtils .unwrapPosition (rootAdapter , this , rootPosition );
101
+
102
+ // get segment
103
+ long segmentedPosition = getSegmentedPosition (localPosition );
104
+ int segment = extractSegmentPart (segmentedPosition );
105
+ int offset = extractSegmentOffsetPart (segmentedPosition );
106
+
107
+ String message ;
108
+
109
+ if (segment == SEGMENT_TYPE_HEADER ) {
110
+ message = "CLICKED: Header item " + offset ;
111
+ } else if (segment == SEGMENT_TYPE_FOOTER ) {
112
+ message = "CLICKED: Footer item " + offset ;
113
+ } else {
114
+ throw new IllegalStateException ("Something wrong." );
115
+ }
116
+
117
+ mOnItemClickListener .onItemClicked (message );
118
+ }
119
+
120
+ // --------------------------------------------
121
+ // [ OPTIONAL ]
122
+ // Set full-span for Grid layout and Staggered Grid layout
123
+
124
+ @ Override
125
+ public void onAttachedToRecyclerView (RecyclerView recyclerView ) {
126
+ super .onAttachedToRecyclerView (recyclerView );
127
+
128
+ setupFullSpanForGridLayoutManager (recyclerView );
129
+ }
130
+
131
+ @ Override
132
+ public void onBindHeaderItemViewHolder (HeaderViewHolder holder , int localPosition ) {
133
+ applyFullSpanForStaggeredGridLayoutManager (holder );
134
+ }
135
+
136
+ @ Override
137
+ public void onBindFooterItemViewHolder (FooterViewHolder holder , int localPosition ) {
138
+ applyFullSpanForStaggeredGridLayoutManager (holder );
139
+ }
140
+
141
+ // Filling span for GridLayoutManager
142
+ protected void setupFullSpanForGridLayoutManager (RecyclerView recyclerView ) {
143
+ RecyclerView .LayoutManager lm = recyclerView .getLayoutManager ();
144
+ if (!(lm instanceof GridLayoutManager )) {
145
+ return ;
146
+ }
147
+
148
+ final GridLayoutManager glm = (GridLayoutManager ) lm ;
149
+ final GridLayoutManager .SpanSizeLookup origSizeLookup = glm .getSpanSizeLookup ();
150
+ final int spanCount = glm .getSpanCount ();
151
+
152
+ glm .setSpanSizeLookup (new GridLayoutManager .SpanSizeLookup () {
153
+ @ Override
154
+ public int getSpanSize (int position ) {
155
+ final long segmentedPosition = getSegmentedPosition (position );
156
+ final int segment = extractSegmentPart (segmentedPosition );
157
+ final int offset = extractSegmentOffsetPart (segmentedPosition );
158
+
159
+ if (segment == SEGMENT_TYPE_NORMAL ) {
160
+ return origSizeLookup .getSpanSize (offset );
161
+ } else {
162
+ return spanCount ; // header or footer
163
+ }
164
+ }
165
+ });
166
+ }
167
+
168
+ protected void applyFullSpanForStaggeredGridLayoutManager (RecyclerView .ViewHolder holder ) {
169
+ ViewGroup .LayoutParams lp = holder .itemView .getLayoutParams ();
170
+
171
+ // Filling span for StaggeredGridLayoutManager
172
+ if (lp instanceof StaggeredGridLayoutManager .LayoutParams ) {
173
+ ((StaggeredGridLayoutManager .LayoutParams ) lp ).setFullSpan (true );
174
+ }
175
+ }
176
+ // --------------------------------------------
177
+ }
0 commit comments