1212 */
1313public class AdapterLayoutDelegate {
1414
15- private RecyclerView .Adapter mAdapter ;
16- private ViewGroup mViewGroup ;
15+ private RecyclerView .Adapter adapter ;
16+ private ViewGroup viewGroup ;
1717
1818 /**
1919 * Checks for if the data changes and changes the views accordingly
@@ -24,37 +24,43 @@ public void onChanged() {
2424 super .onChanged ();
2525 //too general, we just have to completely recreate
2626 recreateViews ();
27+ reindex ();
2728 }
2829
2930 @ Override
3031 public void onItemRangeChanged (int positionStart , int itemCount ) {
3132 super .onItemRangeChanged (positionStart , itemCount );
3233 updateViews (positionStart , itemCount , null );
34+ reindex ();
3335 }
3436
3537 @ Override
3638 public void onItemRangeChanged (int positionStart , int itemCount , Object payload ) {
3739 super .onItemRangeChanged (positionStart , itemCount , payload );
3840 updateViews (positionStart , itemCount , payload );
41+ reindex ();
3942 }
4043
4144 @ Override
4245 public void onItemRangeInserted (int positionStart , int itemCount ) {
4346 super .onItemRangeInserted (positionStart , itemCount );
4447 addViews (positionStart , itemCount );
48+ reindex ();
4549 }
4650
4751 @ Override
4852 public void onItemRangeRemoved (int positionStart , int itemCount ) {
4953 super .onItemRangeRemoved (positionStart , itemCount );
5054 removeViews (positionStart , itemCount );
55+ reindex ();
5156 }
5257
5358 @ Override
5459 public void onItemRangeMoved (int fromPosition , int toPosition , int itemCount ) {
5560 super .onItemRangeMoved (fromPosition , toPosition , itemCount );
5661 //TODO this should probably be smarter and just move relevant views
5762 recreateViews ();
63+ reindex ();
5864 }
5965 };
6066
@@ -64,7 +70,7 @@ public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
6470 * @param viewGroup the ViewGroup which will have views added and removed from
6571 */
6672 public AdapterLayoutDelegate (ViewGroup viewGroup ) {
67- mViewGroup = viewGroup ;
73+ this . viewGroup = viewGroup ;
6874 }
6975
7076 /**
@@ -73,16 +79,16 @@ public AdapterLayoutDelegate(ViewGroup viewGroup) {
7379 * @param adapter the adapter
7480 */
7581 public void setAdapter (@ Nullable RecyclerView .Adapter adapter ) {
76- if (mAdapter != null ) {
82+ if (this . adapter != null ) {
7783 try {
78- mAdapter .unregisterAdapterDataObserver (mObserver );
84+ this . adapter .unregisterAdapterDataObserver (mObserver );
7985 } catch (Exception ignored ) {
8086 }
8187 }
8288
83- mAdapter = adapter ;
84- if (mAdapter != null ) {
85- mAdapter .registerAdapterDataObserver (mObserver );
89+ this . adapter = adapter ;
90+ if (this . adapter != null ) {
91+ this . adapter .registerAdapterDataObserver (mObserver );
8692 }
8793 recreateViews ();
8894 }
@@ -93,7 +99,7 @@ public void setAdapter(@Nullable RecyclerView.Adapter adapter) {
9399 * @return the adapter
94100 */
95101 public RecyclerView .Adapter getAdapter () {
96- return mAdapter ;
102+ return adapter ;
97103 }
98104
99105 /**
@@ -104,7 +110,7 @@ public RecyclerView.Adapter getAdapter() {
104110 */
105111 @ Nullable
106112 public RecyclerView .ViewHolder getViewHolderAt (int index ) {
107- View view = mViewGroup .getChildAt (index );
113+ View view = viewGroup .getChildAt (index );
108114 if (view == null ) {
109115 return null ;
110116 }
@@ -119,56 +125,56 @@ private void addViews(int positionStart, int itemCount) {
119125 }
120126
121127 private void addViewAt (int index ) {
122- addViewAt (mAdapter .getItemViewType (index ), index );
128+ addViewAt (adapter .getItemViewType (index ), index );
123129 }
124130
125131 private void addViewAt (int viewType , int index ) {
126- RecyclerView .ViewHolder viewHolder = mAdapter .onCreateViewHolder (mViewGroup , viewType );
132+ RecyclerView .ViewHolder viewHolder = adapter .onCreateViewHolder (viewGroup , viewType );
127133 //setting the lib to min 4.0 to avoid leaks from doing this
128134 viewHolder .itemView .setTag (R .id .adapter_layout_list_holder , viewHolder );
129135 viewHolder .itemView .setTag (R .id .adapter_layout_list_view_type , viewType );
130136 viewHolder .itemView .setTag (R .id .adapter_layout_list_position , index );
131- mViewGroup .addView (viewHolder .itemView );
132- mAdapter .onBindViewHolder (viewHolder , index );
137+ viewGroup .addView (viewHolder .itemView );
138+ adapter .onBindViewHolder (viewHolder , index );
133139 }
134140
135141 private void updateViews (int positionStart , int itemCount , @ Nullable Object payload ) {
136142 final int end = positionStart + itemCount ;
137143 for (int i = positionStart ; i < end ; i ++) {
138144 RecyclerView .ViewHolder viewHolder = getViewHolderAt (i );
139- mAdapter .onBindViewHolder (viewHolder , i );
145+ adapter .onBindViewHolder (viewHolder , i );
140146 }
141147 }
142148
143149 private void removeViews (int positionStart , int itemCount ) {
144- mViewGroup .removeViews (positionStart , itemCount );
150+ viewGroup .removeViews (positionStart , itemCount );
145151 }
146152
147153 /**
148154 * Updates all the views to match the dataset changing. Its kinda a last resort since we would
149155 * prefer to just adjust the views that were changed or removed
150156 */
151157 private void recreateViews () {
152- if (mAdapter == null ) {
153- mViewGroup .removeAllViews ();
158+ if (adapter == null ) {
159+ viewGroup .removeAllViews ();
154160 return ;
155161 }
156162 int i ;
157- for (i = 0 ; i < mAdapter .getItemCount (); i ++) {
158- int viewType = mAdapter .getItemViewType (i );
163+ for (i = 0 ; i < adapter .getItemCount (); i ++) {
164+ int viewType = adapter .getItemViewType (i );
159165 //This means the view could already exist
160- if (i < mViewGroup .getChildCount ()) {
161- View child = mViewGroup .getChildAt (i );
166+ if (i < viewGroup .getChildCount ()) {
167+ View child = viewGroup .getChildAt (i );
162168 Integer savedViewType = (Integer ) child .getTag (R .id .adapter_layout_list_view_type );
163169 RecyclerView .ViewHolder savedViewHolder = (RecyclerView .ViewHolder ) child .getTag (R .id .adapter_layout_list_holder );
164170
165171 if (savedViewType != null && savedViewType == viewType && savedViewHolder != null ) {
166172 //perfect, it exists and is the right type, so just bind it
167- mAdapter .onBindViewHolder (savedViewHolder , i );
173+ adapter .onBindViewHolder (savedViewHolder , i );
168174 } else {
169175 //it already existed, but something was wrong. So remove it and recreate it
170176 addViewAt (viewType , i );
171- mViewGroup .removeView (child );
177+ viewGroup .removeView (child );
172178 }
173179 } else {
174180 //Creating a brand new view
@@ -177,8 +183,15 @@ private void recreateViews() {
177183 }
178184
179185 //Outside the bounds of the dataset, so remove it
180- if (i < mViewGroup .getChildCount ()) {
181- mViewGroup .removeViews (i , mViewGroup .getChildCount () - i );
186+ if (i < viewGroup .getChildCount ()) {
187+ viewGroup .removeViews (i , viewGroup .getChildCount () - i );
188+ }
189+ }
190+
191+ private void reindex () {
192+ for (int i = 0 ; i < adapter .getItemCount (); i ++) {
193+ View child = viewGroup .getChildAt (i );
194+ child .setTag (R .id .adapter_layout_list_position , i );
182195 }
183196 }
184197}
0 commit comments