Skip to content

Commit aa7a163

Browse files
committed
Make sure that we update items no matter what notify call occurs
1 parent 9af9219 commit aa7a163

4 files changed

Lines changed: 91 additions & 24 deletions

File tree

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

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,38 @@ public class AdapterLayoutDelegate {
2222
@Override
2323
public void onChanged() {
2424
super.onChanged();
25-
//TODO make this smarter so that it will actually remove the proper views
26-
updateViews();
25+
recreateViews();
26+
}
27+
28+
@Override
29+
public void onItemRangeChanged(int positionStart, int itemCount) {
30+
super.onItemRangeChanged(positionStart, itemCount);
31+
recreateViews();
32+
}
33+
34+
@Override
35+
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
36+
super.onItemRangeChanged(positionStart, itemCount, payload);
37+
recreateViews();
38+
}
39+
40+
@Override
41+
public void onItemRangeInserted(int positionStart, int itemCount) {
42+
super.onItemRangeInserted(positionStart, itemCount);
43+
recreateViews();
44+
}
45+
46+
@Override
47+
public void onItemRangeRemoved(int positionStart, int itemCount) {
48+
super.onItemRangeRemoved(positionStart, itemCount);
49+
recreateViews();
50+
}
51+
52+
@Override
53+
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
54+
super.onItemRangeMoved(fromPosition, toPosition, itemCount);
55+
//TODO this should probably be smarter and just move relevant views
56+
recreateViews();
2757
}
2858
};
2959

@@ -50,7 +80,7 @@ public void setAdapter(RecyclerView.Adapter adapter) {
5080
if (mAdapter != null) {
5181
mAdapter.registerAdapterDataObserver(mObserver);
5282
}
53-
updateViews();
83+
recreateViews();
5484
}
5585

5686
public @Nullable RecyclerView.Adapter getAdapter() {
@@ -70,10 +100,45 @@ public void setAdapter(RecyclerView.Adapter adapter) {
70100
return (RecyclerView.ViewHolder) view.getTag(R.id.adapter_layout_list_holder);
71101
}
72102

103+
private void addViews(int positionStart, int itemCount) {
104+
for (int i=positionStart; i<itemCount; i++) {
105+
addViewAt(i);
106+
}
107+
}
108+
109+
private void addViewAt(int index) {
110+
addViewAt(mAdapter.getItemViewType(index), index);
111+
}
112+
113+
private void addViewAt(int viewType, int index) {
114+
RecyclerView.ViewHolder viewHolder = mAdapter.onCreateViewHolder(mViewGroup, viewType);
115+
viewHolder.itemView.setTag(R.id.adapter_layout_list_holder, viewHolder);
116+
viewHolder.itemView.setTag(R.id.adapter_layout_list_view_type, viewType);
117+
mViewGroup.addView(viewHolder.itemView);
118+
mAdapter.onBindViewHolder(viewHolder, index);
119+
}
120+
121+
private void updateViews(int positionStart, int itemCount, Object payload) {
122+
//TODO do something with the payload?
123+
for (int i=positionStart; i<itemCount; i++) {
124+
RecyclerView.ViewHolder viewHolder = getViewHolderAt(i);
125+
if (payload != null) {
126+
mAdapter.onBindViewHolder(viewHolder, i);
127+
} else {
128+
mAdapter.onBindViewHolder(viewHolder, i);
129+
}
130+
}
131+
}
132+
133+
private void removeViews(int positionStart, int itemCount) {
134+
mViewGroup.removeViews(positionStart, itemCount);
135+
}
136+
73137
/**
74-
* Updates all the views to match the dataset changing
138+
* Updates all the views to match the dataset changing. Its kinda a last resort since we would
139+
* prefer to just adjust the views that were changed or removed
75140
*/
76-
private void updateViews() {
141+
private void recreateViews() {
77142
if (mAdapter == null) {
78143
mViewGroup.removeAllViews();
79144
return;
@@ -90,22 +155,16 @@ private void updateViews() {
90155
RecyclerView.ViewHolder savedViewHolder = (RecyclerView.ViewHolder) child.getTag(R.id.adapter_layout_list_holder);
91156

92157
if (savedViewType != null && savedViewType == viewType && savedViewHolder != null) {
158+
//perfect, it exists and is the right type, so just bind it
93159
mAdapter.onBindViewHolder(savedViewHolder, i);
94160
} else {
95-
RecyclerView.ViewHolder viewHolder = mAdapter.onCreateViewHolder(mViewGroup, viewType);
96-
viewHolder.itemView.setTag(R.id.adapter_layout_list_holder, viewHolder);
97-
viewHolder.itemView.setTag(R.id.adapter_layout_list_view_type, viewType);
98-
mAdapter.onBindViewHolder(viewHolder, i);
99-
mViewGroup.addView(viewHolder.itemView, i);
161+
//it already existed, but something was wrong. So remove it and recreate it
162+
addViewAt(viewType, i);
100163
mViewGroup.removeView(child);
101164
}
102165
} else {
103166
//Creating a brand new view
104-
RecyclerView.ViewHolder viewHolder = mAdapter.onCreateViewHolder(mViewGroup, viewType);
105-
viewHolder.itemView.setTag(R.id.adapter_layout_list_holder, viewHolder);
106-
viewHolder.itemView.setTag(R.id.adapter_layout_list_view_type, viewType);
107-
mAdapter.onBindViewHolder(viewHolder, i);
108-
mViewGroup.addView(viewHolder.itemView);
167+
addViewAt(viewType, i);
109168
}
110169
} else {
111170
//Outside the bounds of the dataset, so remove it

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,23 @@ public void setData(Collection<Cheese> cheeses) {
3636

3737
public void add(Cheese cheese) {
3838
mValues.add(cheese);
39-
notifyDataSetChanged();
39+
notifyItemInserted(mValues.size()-1);
4040
}
4141

4242
public void removeLast() {
4343
if (!mValues.isEmpty()) {
44-
mValues.remove(mValues.size() - 1);
45-
notifyDataSetChanged();
44+
int removeIndex = mValues.size() - 1;
45+
mValues.remove(removeIndex);
46+
notifyItemRemoved(removeIndex);
4647
}
4748
}
4849

4950
public void removeMiddle() {
5051
if (!mValues.isEmpty()) {
51-
mValues.remove(mValues.size()/2);
52+
int indexRemoved = mValues.size()/2;
53+
mValues.remove(indexRemoved);
54+
notifyItemRemoved(indexRemoved);
5255
}
53-
notifyDataSetChanged();
5456
}
5557

5658
@Override

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
import android.content.Intent;
44
import android.os.Bundle;
5+
import android.support.design.widget.Snackbar;
56
import android.support.v7.app.AppCompatActivity;
67
import android.support.v7.widget.Toolbar;
78
import android.view.MenuItem;
8-
import android.widget.Toast;
9+
import android.view.ViewGroup;
910

1011
import com.commit451.adapterlayout.AdapterLinearLayout;
1112

@@ -15,8 +16,12 @@
1516

1617
public class MainActivity extends AppCompatActivity {
1718

18-
@Bind(R.id.toolbar) Toolbar mToolbar;
19-
@Bind(R.id.adapter_layout) AdapterLinearLayout mAdapterLinearLayout;
19+
@Bind(R.id.root)
20+
ViewGroup mRoot;
21+
@Bind(R.id.toolbar)
22+
Toolbar mToolbar;
23+
@Bind(R.id.adapter_layout)
24+
AdapterLinearLayout mAdapterLinearLayout;
2025
CheeseAdapter mAdapter;
2126

2227
@OnClick(R.id.add_cheese)
@@ -44,7 +49,7 @@ void onNewAdapterClicked() {
4449
private CheeseAdapter.Listener mListener = new CheeseAdapter.Listener() {
4550
@Override
4651
public void onItemClicked(Cheese cheese) {
47-
Toast.makeText(MainActivity.this, cheese.getName() + " clicked", Toast.LENGTH_SHORT)
52+
Snackbar.make(mRoot, cheese.getName() + " clicked", Snackbar.LENGTH_SHORT)
4853
.show();
4954
}
5055
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:id="@+id/root"
34
android:layout_width="match_parent"
45
android:layout_height="match_parent"
56
android:orientation="vertical">

0 commit comments

Comments
 (0)