Skip to content

Commit 67a4815

Browse files
committed
Reindex after views are modified
1 parent 6af9201 commit 67a4815

File tree

9 files changed

+88
-67
lines changed

9 files changed

+88
-67
lines changed

.travis.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ android:
77
components:
88
- platform-tools
99
- tools
10-
- build-tools-25.0.2
11-
- android-25
12-
- extra-android-m2repository
10+
- build-tools-26.0.1
11+
- android-26
1312

1413
script: "./gradlew build"

adapterflowlayout/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ android {
2222
}
2323

2424
dependencies {
25-
compile fileTree(dir: 'libs', include: ['*.jar'])
26-
compile 'com.wefika:flowlayout:0.4.1'
27-
provided project(':adapterlayout')
25+
api fileTree(dir: 'libs', include: ['*.jar'])
26+
compileOnly 'com.wefika:flowlayout:0.4.1'
27+
compileOnly project(':adapterlayout')
2828
}
2929

3030
apply from: 'https://raw.githubusercontent.com/Commit451/gradle-android-javadocs/1.0.0/gradle-android-javadocs.gradle'

adapterflowlayout/src/main/java/com/commit451/adapterflowlayout/AdapterFlowLayout.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
public class AdapterFlowLayout extends FlowLayout {
1515

16-
private AdapterLayoutDelegate mAdapterLayoutDelegate;
16+
private AdapterLayoutDelegate adapterLayoutDelegate;
1717

1818
public AdapterFlowLayout(Context context) {
1919
super(context);
@@ -28,24 +28,24 @@ public AdapterFlowLayout(Context context, AttributeSet attrs, int defStyleAttr)
2828
}
2929

3030
public void setAdapter(RecyclerView.Adapter adapter) {
31-
if (mAdapterLayoutDelegate == null) {
32-
mAdapterLayoutDelegate = new AdapterLayoutDelegate(this);
31+
if (adapterLayoutDelegate == null) {
32+
adapterLayoutDelegate = new AdapterLayoutDelegate(this);
3333
}
34-
mAdapterLayoutDelegate.setAdapter(adapter);
34+
adapterLayoutDelegate.setAdapter(adapter);
3535
}
3636

3737
@Nullable
3838
public RecyclerView.Adapter getAdapter() {
39-
if (mAdapterLayoutDelegate != null) {
40-
return mAdapterLayoutDelegate.getAdapter();
39+
if (adapterLayoutDelegate != null) {
40+
return adapterLayoutDelegate.getAdapter();
4141
}
4242
return null;
4343
}
4444

4545
@Nullable
4646
public RecyclerView.ViewHolder getViewHolderAt(int index) {
47-
if (mAdapterLayoutDelegate != null) {
48-
return mAdapterLayoutDelegate.getViewHolderAt(index);
47+
if (adapterLayoutDelegate != null) {
48+
return adapterLayoutDelegate.getViewHolderAt(index);
4949
}
5050
return null;
5151
}

adapterlayout-kotlin/build.gradle

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@ android {
2020
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2121
}
2222
}
23-
sourceSets {
24-
main.java.srcDirs += 'src/main/kotlin'
25-
}
2623
lintOptions {
2724
abortOnError false
2825
}
2926
}
3027

3128
dependencies {
32-
compile fileTree(dir: 'libs', include: ['*.jar'])
33-
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
34-
provided project(':adapterlayout')
29+
api fileTree(dir: 'libs', include: ['*.jar'])
30+
31+
api "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion"
32+
33+
compileOnly project(':adapterlayout')
3534
}

adapterlayout/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ android {
2222
}
2323

2424
dependencies {
25-
compile fileTree(include: ['*.jar'], dir: 'libs')
26-
compile "com.android.support:recyclerview-v7:$supportLibVersion"
25+
api fileTree(include: ['*.jar'], dir: 'libs')
26+
api "com.android.support:recyclerview-v7:$supportLibVersion"
2727
}
2828

2929
apply from: 'https://raw.githubusercontent.com/Commit451/gradle-android-javadocs/1.0.0/gradle-android-javadocs.gradle'

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

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
*/
1313
public 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
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
public class AdapterLinearLayout extends LinearLayout {
1818

19-
private AdapterLayoutDelegate mAdapterLayoutDelegate;
19+
private AdapterLayoutDelegate adapterLayoutDelegate;
2020

2121
public AdapterLinearLayout(Context context) {
2222
super(context);
@@ -37,23 +37,23 @@ public AdapterLinearLayout(Context context, AttributeSet attrs, int defStyleAttr
3737
}
3838

3939
public void setAdapter(RecyclerView.Adapter adapter) {
40-
if (mAdapterLayoutDelegate == null) {
41-
mAdapterLayoutDelegate = new AdapterLayoutDelegate(this);
40+
if (adapterLayoutDelegate == null) {
41+
adapterLayoutDelegate = new AdapterLayoutDelegate(this);
4242
}
43-
mAdapterLayoutDelegate.setAdapter(adapter);
43+
adapterLayoutDelegate.setAdapter(adapter);
4444
}
4545

4646
public RecyclerView.Adapter getAdapter() {
47-
if (mAdapterLayoutDelegate != null) {
48-
return mAdapterLayoutDelegate.getAdapter();
47+
if (adapterLayoutDelegate != null) {
48+
return adapterLayoutDelegate.getAdapter();
4949
}
5050
return null;
5151
}
5252

5353
@Nullable
5454
public RecyclerView.ViewHolder getViewHolderAt(int index) {
55-
if (mAdapterLayoutDelegate != null) {
56-
return mAdapterLayoutDelegate.getViewHolderAt(index);
55+
if (adapterLayoutDelegate != null) {
56+
return adapterLayoutDelegate.getViewHolderAt(index);
5757
}
5858
return null;
5959
}

app/build.gradle

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,21 @@ android {
2323
}
2424
}
2525

26+
ext {
27+
butterknifeVersion = '8.8.1'
28+
}
2629
dependencies {
27-
compile fileTree(dir: 'libs', include: ['*.jar'])
28-
testCompile 'junit:junit:4.12'
29-
compile "com.android.support:appcompat-v7:$supportLibVersion"
30-
compile "com.android.support:design:$supportLibVersion"
31-
compile 'com.jakewharton:butterknife:8.5.1'
32-
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
33-
compile project(':adapterlayout')
34-
compile project(':adapterflowlayout')
30+
implementation fileTree(dir: 'libs', include: ['*.jar'])
31+
32+
implementation "com.android.support:appcompat-v7:$supportLibVersion"
33+
implementation "com.android.support:design:$supportLibVersion"
34+
35+
implementation "com.jakewharton:butterknife:$butterknifeVersion"
36+
annotationProcessor "com.jakewharton:butterknife-compiler:$butterknifeVersion"
37+
38+
implementation 'com.wefika:flowlayout:0.4.1'
39+
40+
implementation project(':adapterlayout')
41+
42+
implementation project(':adapterflowlayout')
3543
}

build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ buildscript {
44
ext.kotlinVersion = '1.1.51'
55
repositories {
66
jcenter()
7+
google()
78
}
89
dependencies {
910
classpath 'com.android.tools.build:gradle:3.0.0-beta6'
@@ -19,6 +20,7 @@ buildscript {
1920
allprojects {
2021
repositories {
2122
jcenter()
23+
google()
2224
}
2325
}
2426

@@ -28,8 +30,8 @@ task clean(type: Delete) {
2830

2931
ext {
3032
minSdkVersion = 15
31-
compileSdkVersion = 25
33+
compileSdkVersion = 26
3234
targetSdkVersion = compileSdkVersion
33-
buildToolsVersion = '25.0.2'
34-
supportLibVersion = '25.3.1'
35+
buildToolsVersion = '26.0.1'
36+
supportLibVersion = '26.1.0'
3537
}

0 commit comments

Comments
 (0)