Skip to content

Commit 9bec3f6

Browse files
committed
new endless recycler view impl
1 parent 96bbdfc commit 9bec3f6

15 files changed

+988
-2137
lines changed

recycler/src/main/java/com/mcxiaoke/next/recycler/AbstractHeaderFooterRecyclerAdapter.java

Lines changed: 0 additions & 87 deletions
This file was deleted.
Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
package com.mcxiaoke.next.recycler;
2+
3+
import android.os.Handler;
4+
import android.support.annotation.LayoutRes;
5+
import android.support.annotation.NonNull;
6+
import android.support.v7.widget.RecyclerView;
7+
import android.support.v7.widget.RecyclerView.Adapter;
8+
import android.support.v7.widget.RecyclerView.AdapterDataObserver;
9+
import android.support.v7.widget.RecyclerView.ViewHolder;
10+
import android.util.Log;
11+
import android.view.ViewGroup;
12+
import com.mcxiaoke.next.recycler.AdvancedRecyclerView.ItemViewHolder;
13+
import com.mcxiaoke.next.recycler.AdvancedRecyclerView.ViewHolderCreator;
14+
import com.mcxiaoke.next.recycler.AdvancedRecyclerView.SimpleViewHolderCreator;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
/**
20+
* User: mcxiaoke
21+
* Date: 2018/6/17
22+
* Time: 17:13
23+
*/
24+
class AdvancedRecyclerAdapter extends HeaderFooterRecyclerAdapter {
25+
private static final String TAG = "AdvancedRecyclerAdapter";
26+
private static final int VIEW_TYPE_LOADING_HEADER = 90001;
27+
private static final int VIEW_TYPE_LOADING_FOOTER = 90002;
28+
private static final int DEFAULT_LOADING_HEADER_LAYOUT = R.layout.layout_advanced_recycler_view_loading;
29+
private static final int DEFAULT_LOADING_FOOTER_LAYOUT = R.layout.layout_advanced_recycler_view_loading;
30+
31+
private AdapterDataObserver mAdapterDataObserver = new AdapterDataObserver() {
32+
@Override
33+
public void onItemRangeRemoved(final int positionStart, final int itemCount) {
34+
super.onItemRangeRemoved(positionStart, itemCount);
35+
Log.v(TAG, "onItemRangeRemoved() start=" + positionStart + " count=" + itemCount);
36+
notifyItemRangeRemoved(positionStart, itemCount);
37+
}
38+
39+
@Override
40+
public void onItemRangeMoved(final int fromPosition, final int toPosition, final int itemCount) {
41+
super.onItemRangeMoved(fromPosition, toPosition, itemCount);
42+
Log.v(TAG, "onItemRangeMoved() start=" + fromPosition + " count=" + itemCount);
43+
notifyItemRangeChanged(fromPosition, itemCount);
44+
}
45+
46+
@Override
47+
public void onItemRangeInserted(final int positionStart, final int itemCount) {
48+
super.onItemRangeInserted(positionStart, itemCount);
49+
Log.v(TAG, "onItemRangeInserted() start=" + positionStart + " count=" + itemCount);
50+
notifyItemRangeInserted(positionStart, itemCount);
51+
}
52+
53+
@Override
54+
public void onItemRangeChanged(final int positionStart, final int itemCount) {
55+
super.onItemRangeChanged(positionStart, itemCount);
56+
Log.v(TAG, "onItemRangeChanged() start=" + positionStart + " count=" + itemCount);
57+
notifyItemRangeChanged(positionStart, itemCount);
58+
}
59+
60+
@Override
61+
public void onChanged() {
62+
super.onChanged();
63+
notifyDataSetChanged();
64+
}
65+
};
66+
67+
private ViewHolderCreator<ItemViewHolder> mHeaderCreator =
68+
new SimpleViewHolderCreator(DEFAULT_LOADING_HEADER_LAYOUT);
69+
private ViewHolderCreator<ItemViewHolder> mFooterCreator =
70+
new SimpleViewHolderCreator(DEFAULT_LOADING_FOOTER_LAYOUT);
71+
72+
73+
private RecyclerView.Adapter mWrapped;
74+
private Handler mHandler = new Handler();
75+
private boolean mHeaderLoading = false;
76+
private boolean mFooterLoading = false;
77+
private List<ViewHolderCreator> mHeaders = new ArrayList<>();
78+
private List<ViewHolderCreator> mFooters = new ArrayList<>();
79+
80+
public AdvancedRecyclerAdapter(final RecyclerView.Adapter<?> adapter) {
81+
mWrapped = adapter;
82+
mWrapped.registerAdapterDataObserver(mAdapterDataObserver);
83+
}
84+
85+
public boolean isHeaderLoading() {
86+
return mHeaderLoading;
87+
}
88+
89+
public void setHeaderLoading(final boolean loading) {
90+
if (loading != mHeaderLoading) {
91+
mHeaderLoading = loading;
92+
if (loading) {
93+
notifyHeaderItemInserted(0);
94+
} else {
95+
notifyHeaderItemRemoved(0);
96+
}
97+
}
98+
}
99+
100+
public boolean isFooterLoading() {
101+
return mFooterLoading;
102+
}
103+
104+
public void setFooterLoading(final boolean loading) {
105+
if (loading != mFooterLoading) {
106+
mFooterLoading = loading;
107+
if (loading) {
108+
notifyFooterItemInserted(0);
109+
} else {
110+
notifyFooterItemRemoved(0);
111+
}
112+
}
113+
}
114+
115+
public void setLoadingHeader(final ViewHolderCreator<ItemViewHolder> creator) {
116+
mHeaderCreator = creator;
117+
notifyHeaderItemChanged(0);
118+
}
119+
120+
public void setLoadingFooter(final ViewHolderCreator<ItemViewHolder> creator) {
121+
mFooterCreator = creator;
122+
notifyFooterItemChanged(0);
123+
}
124+
125+
public void setLoadingHeader(@LayoutRes final int layoutRes) {
126+
setLoadingHeader(new SimpleViewHolderCreator(layoutRes));
127+
}
128+
129+
public void setLoadingFooter(@LayoutRes final int layoutRes) {
130+
setLoadingFooter(new SimpleViewHolderCreator(layoutRes));
131+
}
132+
133+
public void addHeader(ViewHolderCreator header) {
134+
mHeaders.add(header);
135+
notifyHeaderItemInserted(mHeaders.size());
136+
}
137+
138+
public int removeHeader(ViewHolderCreator header) {
139+
int index = mHeaders.indexOf(header);
140+
if (index != -1) {
141+
mHeaders.remove(index);
142+
notifyHeaderItemRemoved(index);
143+
}
144+
return index;
145+
}
146+
147+
public void addFooter(ViewHolderCreator footer) {
148+
mFooters.add(footer);
149+
notifyFooterItemInserted(mFooters.size());
150+
}
151+
152+
public int removeFooter(ViewHolderCreator footer) {
153+
int index = mFooters.indexOf(footer);
154+
if (index != -1) {
155+
mFooters.remove(index);
156+
notifyFooterItemRemoved(index);
157+
}
158+
return index;
159+
}
160+
161+
public Adapter getWrapped() {
162+
return mWrapped;
163+
}
164+
165+
@Override
166+
public void onAttachedToRecyclerView(@NonNull final RecyclerView recyclerView) {
167+
super.onAttachedToRecyclerView(recyclerView);
168+
mWrapped.onAttachedToRecyclerView(recyclerView);
169+
}
170+
171+
@Override
172+
public void onDetachedFromRecyclerView(@NonNull final RecyclerView recyclerView) {
173+
super.onDetachedFromRecyclerView(recyclerView);
174+
mWrapped.onDetachedFromRecyclerView(recyclerView);
175+
mWrapped.unregisterAdapterDataObserver(mAdapterDataObserver);
176+
}
177+
178+
@SuppressWarnings("unchecked")
179+
@Override
180+
public void onViewAttachedToWindow(@NonNull final ViewHolder holder) {
181+
super.onViewAttachedToWindow(holder);
182+
mWrapped.onViewAttachedToWindow(holder);
183+
}
184+
185+
@SuppressWarnings("unchecked")
186+
@Override
187+
public void onViewDetachedFromWindow(@NonNull final ViewHolder holder) {
188+
super.onViewDetachedFromWindow(holder);
189+
mWrapped.onViewDetachedFromWindow(holder);
190+
}
191+
192+
@SuppressWarnings("unchecked")
193+
@Override
194+
public void onViewRecycled(@NonNull final ViewHolder holder) {
195+
super.onViewRecycled(holder);
196+
mWrapped.onViewRecycled(holder);
197+
}
198+
199+
@Override
200+
protected int getHeaderItemCount() {
201+
int count = 0;
202+
if (mHeaderLoading) {
203+
count++;
204+
}
205+
count += mHeaders.size();
206+
return count;
207+
}
208+
209+
@Override
210+
protected int getFooterItemCount() {
211+
int count = 0;
212+
if (mFooterLoading) {
213+
count++;
214+
}
215+
count += mFooters.size();
216+
return count;
217+
}
218+
219+
@Override
220+
protected int getContentItemCount() {
221+
return mWrapped.getItemCount();
222+
}
223+
224+
@Override
225+
protected int getHeaderItemViewType(final int position) {
226+
if (mHeaderLoading) {
227+
if (position == 0) {
228+
return VIEW_TYPE_LOADING_HEADER;
229+
} else {
230+
return position - 1;
231+
}
232+
}
233+
return position;
234+
}
235+
236+
@Override
237+
protected int getFooterItemViewType(final int position) {
238+
if (mFooterLoading) {
239+
if (position == 0) {
240+
return VIEW_TYPE_LOADING_FOOTER;
241+
} else {
242+
return position - 1;
243+
}
244+
}
245+
return position;
246+
}
247+
248+
@Override
249+
protected int getContentItemViewType(final int position) {
250+
return mWrapped.getItemViewType(position);
251+
}
252+
253+
254+
@Override
255+
protected ViewHolder onCreateHeaderItemViewHolder(final ViewGroup parent, final int viewType) {
256+
final ViewHolder holder;
257+
if (viewType == VIEW_TYPE_LOADING_HEADER) {
258+
holder = mHeaderCreator.create(parent);
259+
} else {
260+
holder = mHeaders.get(viewType).create(parent);
261+
}
262+
// https://stackoverflow.com/questions/35474751/java-lang-throwable-addinarray-in-adapter
263+
holder.setIsRecyclable(false);
264+
return holder;
265+
}
266+
267+
@Override
268+
protected ViewHolder onCreateFooterItemViewHolder(final ViewGroup parent, final int viewType) {
269+
final ViewHolder holder;
270+
if (viewType == VIEW_TYPE_LOADING_FOOTER) {
271+
holder = mFooterCreator.create(parent);
272+
} else {
273+
holder = mFooters.get(viewType).create(parent);
274+
}
275+
holder.setIsRecyclable(false);
276+
return holder;
277+
}
278+
279+
@Override
280+
protected ViewHolder onCreateContentItemViewHolder(final ViewGroup parent, final int viewType) {
281+
return mWrapped.onCreateViewHolder(parent, viewType);
282+
}
283+
284+
@Override
285+
protected void onBindHeaderItemViewHolder(final ViewHolder holder, final int position) {
286+
if (holder instanceof ItemViewHolder) {
287+
((ItemViewHolder) holder).bind(position);
288+
}
289+
}
290+
291+
@Override
292+
protected void onBindFooterItemViewHolder(final ViewHolder holder, final int position) {
293+
if (holder instanceof ItemViewHolder) {
294+
((ItemViewHolder) holder).bind(position);
295+
}
296+
}
297+
298+
@SuppressWarnings("unchecked")
299+
@Override
300+
protected void onBindContentItemViewHolder(final ViewHolder holder, final int position) {
301+
mWrapped.onBindViewHolder(holder, position);
302+
}
303+
304+
}

0 commit comments

Comments
 (0)