Skip to content

Commit c2b7b30

Browse files
committed
Merge branch 'feature/improve_wrapper_adapter_position_handling' into develop
2 parents 2996566 + 5e33991 commit c2b7b30

File tree

80 files changed

+6730
-633
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+6730
-633
lines changed

example/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ dependencies {
6161
compile fileTree(dir: 'libs', include: ['*.jar'])
6262
compile project(':library')
6363
compile 'com.android.support:design:25.0.0'
64+
compile 'com.h6ah4i.android.tablayouthelper:tablayouthelper:0.7.0'
6465
}

example/src/main/AndroidManifest.xml

+25-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<manifest
1818
package="com.h6ah4i.android.example.advrecyclerview"
1919
xmlns:android="http://schemas.android.com/apk/res/android"
20-
xmlns:tools="http://schemas.android.com/tools">
20+
>
2121

2222
<application
2323
android:allowBackup="true"
@@ -115,6 +115,30 @@
115115
android:name=".demo_s_viewpager.ViewPagerSwipeableExampleActivity"
116116
android:label="@string/activity_title_demo_s_viewpager"/>
117117

118+
<activity
119+
android:name=".demo_hf_minimal.MinimalHeaderFooterExampleActivity"
120+
android:label="@string/activity_title_demo_hf_minimal"/>
121+
122+
<activity
123+
android:name=".demo_hf_e.ExpandableWithHeaderFooterExampleActivity"
124+
android:label="@string/activity_title_demo_hf_e"/>
125+
126+
<activity
127+
android:name=".demo_hf_add_remove.AddRemoveHeaderFooterExampleActivity"
128+
android:label="@string/activity_title_demo_hf_add_remove"/>
129+
130+
<activity
131+
android:name=".demo_wa_insertion.CustomInsertionWrapperAdapterExampleActivity"
132+
android:label="@string/activity_title_demo_wa_insertion"/>
133+
134+
<activity
135+
android:name=".demo_wa_filtering.CustomFilteringWrapperAdapterExampleActivity"
136+
android:label="@string/activity_title_demo_wa_filtering"/>
137+
138+
<activity
139+
android:name=".demo_composition_all.CompositionAllExampleActivity"
140+
android:label="@string/activity_title_demo_composition_all"/>
141+
118142
<activity
119143
android:name=".about.AboutActivity"
120144
android:label="@string/activity_title_about"/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://github.com/h6ah4i/android-tablayouthelper
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TabLayoutHelper
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Copyright (C) 2015 Haruki Hasegawa
2+
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
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+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
public interface OnListItemClickMessageListener {
19+
void onItemClicked(String message);
20+
}

0 commit comments

Comments
 (0)