Skip to content

Commit c7a9ab4

Browse files
committed
Properly add and remove views based on the notify call instead of just recreating everything every time.
1 parent d089250 commit c7a9ab4

5 files changed

Lines changed: 52 additions & 11 deletions

File tree

adapterlayout/src/main/java/com/commit451/adapterlayout/AdapterLayoutDelegate.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,20 @@ public class AdapterLayoutDelegate {
1616
private ViewGroup mViewGroup;
1717

1818
/**
19-
* Checks for if the data changes
19+
* Checks for if the data changes and changes the views accordingly
2020
*/
2121
private RecyclerView.AdapterDataObserver mObserver = new RecyclerView.AdapterDataObserver() {
2222
@Override
2323
public void onChanged() {
2424
super.onChanged();
25+
//too general, we just have to completely recreate
2526
recreateViews();
2627
}
2728

2829
@Override
2930
public void onItemRangeChanged(int positionStart, int itemCount) {
3031
super.onItemRangeChanged(positionStart, itemCount);
31-
recreateViews();
32+
updateViews(positionStart, itemCount, null);
3233
}
3334

3435
@Override
@@ -40,13 +41,13 @@ public void onItemRangeChanged(int positionStart, int itemCount, Object payload)
4041
@Override
4142
public void onItemRangeInserted(int positionStart, int itemCount) {
4243
super.onItemRangeInserted(positionStart, itemCount);
43-
recreateViews();
44+
addViews(positionStart, itemCount);
4445
}
4546

4647
@Override
4748
public void onItemRangeRemoved(int positionStart, int itemCount) {
4849
super.onItemRangeRemoved(positionStart, itemCount);
49-
recreateViews();
50+
removeViews(positionStart, itemCount);
5051
}
5152

5253
@Override
@@ -83,6 +84,10 @@ public void setAdapter(RecyclerView.Adapter adapter) {
8384
recreateViews();
8485
}
8586

87+
/**
88+
* Returns the adapter which was passed via {@link #setAdapter(RecyclerView.Adapter)}
89+
* @return the adapter
90+
*/
8691
public @Nullable RecyclerView.Adapter getAdapter() {
8792
return mAdapter;
8893
}
@@ -101,7 +106,8 @@ public void setAdapter(RecyclerView.Adapter adapter) {
101106
}
102107

103108
private void addViews(int positionStart, int itemCount) {
104-
for (int i=positionStart; i<itemCount; i++) {
109+
final int end = positionStart + itemCount;
110+
for (int i=positionStart; i<end; i++) {
105111
addViewAt(i);
106112
}
107113
}
@@ -120,7 +126,8 @@ private void addViewAt(int viewType, int index) {
120126

121127
private void updateViews(int positionStart, int itemCount, Object payload) {
122128
//TODO do something with the payload?
123-
for (int i=positionStart; i<itemCount; i++) {
129+
final int end = positionStart + itemCount;
130+
for (int i=positionStart; i<end; i++) {
124131
RecyclerView.ViewHolder viewHolder = getViewHolderAt(i);
125132
if (payload != null) {
126133
mAdapter.onBindViewHolder(viewHolder, i);

app/src/main/java/com/commit451/adapterlayout/sample/CheeseAdapter.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,23 @@ public void changeMiddle() {
5555
}
5656
}
5757

58+
public void changeAll() {
59+
if (!mValues.isEmpty()) {
60+
for (Cheese cheese : mValues) {
61+
cheese.setName("Swiss");
62+
}
63+
notifyItemRangeChanged(0, mValues.size());
64+
}
65+
}
66+
67+
public void clear() {
68+
if (!mValues.isEmpty()) {
69+
int size = mValues.size();
70+
mValues.clear();
71+
notifyItemRangeRemoved(0, size);
72+
}
73+
}
74+
5875
@Override
5976
public CheeseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
6077
CheeseViewHolder holder = CheeseViewHolder.inflate(parent);

app/src/main/java/com/commit451/adapterlayout/sample/CustomAdapterLayoutActivity.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@ void onRemoveCheeseClicked() {
2828
mAdapter.removeLast();
2929
}
3030

31-
@OnClick(R.id.change_middle)
32-
void onRemoveMiddleClicked() {
33-
mAdapter.changeMiddle();
34-
}
35-
3631
@OnClick(R.id.new_adapter)
3732
void onNewAdapterClicked() {
3833
mAdapterLayout.setAdapter(null);

app/src/main/java/com/commit451/adapterlayout/sample/MainActivity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ void onRemoveMiddleClicked() {
3939
mAdapter.changeMiddle();
4040
}
4141

42+
@OnClick(R.id.clear_all)
43+
void onClearAll() {
44+
mAdapter.clear();
45+
}
46+
47+
@OnClick(R.id.change_all)
48+
void onChangeAll() {
49+
mAdapter.changeAll();
50+
}
51+
4252
@OnClick(R.id.new_adapter)
4353
void onNewAdapterClicked() {
4454
mAdapterLinearLayout.setAdapter(null);

app/src/main/res/layout/activity_main.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@
4848
android:layout_height="wrap_content"
4949
android:text="Change Middle" />
5050

51+
<Button
52+
android:id="@+id/clear_all"
53+
android:layout_width="wrap_content"
54+
android:layout_height="wrap_content"
55+
android:text="Clear All" />
56+
57+
<Button
58+
android:id="@+id/change_all"
59+
android:layout_width="wrap_content"
60+
android:layout_height="wrap_content"
61+
android:text="Change All" />
62+
5163
<Button
5264
android:id="@+id/new_adapter"
5365
android:layout_width="wrap_content"

0 commit comments

Comments
 (0)