@@ -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
0 commit comments