Skip to content

Commit 6a07707

Browse files
committed
create diffadapter2
1 parent 8f678ca commit 6a07707

File tree

10 files changed

+81
-251
lines changed

10 files changed

+81
-251
lines changed

app/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ dependencies {
3636

3737
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
3838

39-
// api "com.github.silencedut:diffadapter:1.3.8"
39+
// api "com.github.silencedut:diffadapter:2.0.0_alpha"
4040
api "android.arch.lifecycle:extensions:$lifecycle_extensions"
4141
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
4242

app/src/main/java/com/silencedut/diffadapterdemo/LOLActivity.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,9 @@ class LOLActivity : AppCompatActivity(){
7979

8080
}
8181

82-
findViewById<View>(R.id.random_add).setOnClickListener { _ ->
82+
findViewById<View>(R.id.random_add).setOnClickListener {
8383
val oneLegend = Transfer.getImpl(ILegendDateProvider::class.java).fetchOneLegends()
8484
diffAdapter.addData(legendViewModel.convertToAdapterData(oneLegend))
85-
diffAdapter.datas.add(0,diffAdapter.datas[(0 until diffAdapter.itemCount-1).random()])
86-
diffAdapter.datas = diffAdapter.datas
8785
}
8886

8987
findViewById<View>(R.id.random_insert).setOnClickListener { _ ->

app/src/main/java/com/silencedut/diffadapterdemo/LegendViewModel.kt

+5-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.silencedut.diffadapterdemo
22

33
import android.arch.lifecycle.MutableLiveData
44
import android.arch.lifecycle.ViewModel
5-
import android.os.Bundle
65
import android.util.Log
76
import com.silencedut.core.Transfer
87
import com.silencedut.core.provider.legend.ILegendDateProvider
@@ -11,7 +10,6 @@ import com.silencedut.core.provider.legend.pojo.*
1110
import com.silencedut.diffadapter.DiffAdapter
1211
import com.silencedut.diffadapter.data.BaseMutableData
1312
import com.silencedut.diffadapter.utils.UpdatePayloadFunction
14-
import com.silencedut.diffadapter.utils.UpdateFunction
1513
import com.silencedut.diffadapterdemo.adapter.LegendViewData
1614
import com.silencedut.diffadapterdemo.adapter.SkinViewData
1715

@@ -117,17 +115,18 @@ class LegendViewModel : ViewModel(), LegendNotification.LegendInfo, LegendNotifi
117115
})
118116

119117
//如果变化的数据只需要特定类型的Holder刷新,类型即可指定
120-
diffAdapter.addUpdateMediator(legendSkinData, object : UpdateFunction<LegendSkin, SkinViewData> {
118+
diffAdapter.addUpdateMediator(legendSkinData, object : UpdatePayloadFunction<LegendSkin, SkinViewData> {
121119
override fun providerMatchFeature(input: LegendSkin): Any {
122120
return input.id
123121
}
124122

125-
override fun applyChange(input: LegendSkin, originalData: SkinViewData): SkinViewData {
126-
Log.d(TAG, "applyChange legendSkinData $input")
127-
//可以在原对象上修改
123+
override fun applyChange(
124+
input: LegendSkin, originalData: SkinViewData, payloadKeys: MutableSet<String>
125+
): SkinViewData {
128126
originalData.legendSkin = input
129127
return originalData
130128
}
129+
131130
})
132131
}
133132

diffadapter/src/main/java/com/silencedut/diffadapter/AsyncListUpdateDiffer.java

+49-36
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
import java.util.Set;
2020

2121
/**
22-
*
2322
* @author SilenceDut
2423
* @date 2018/12/19
2524
*/
2625
class AsyncListUpdateDiffer<T extends BaseMutableData> {
27-
private static final String TAG ="AsyncListUpdateDiffer";
26+
private static final String TAG = "AsyncListUpdateDiffer";
2827
private final ListUpdateCallback mUpdateCallback;
2928
private final AsyncDifferConfig<T> mConfig;
3029
private final ListChangedCallback<T> mListChangedCallback;
@@ -36,42 +35,48 @@ class AsyncListUpdateDiffer<T extends BaseMutableData> {
3635
static final int DELAY_STEP = 5;
3736
private Handler mDiffHandler;
3837

39-
AsyncListUpdateDiffer(@NonNull DiffAdapter adapter, @NonNull ListChangedCallback<T> listChangedCallback, @NonNull DiffUtil.ItemCallback<T> diffCallback) {
38+
AsyncListUpdateDiffer(@NonNull DiffAdapter adapter, @NonNull ListChangedCallback<T> listChangedCallback,
39+
@NonNull DiffUtil.ItemCallback<T> diffCallback) {
4040
this.mDiffHandler = adapter.mDiffHandler;
4141
this.mUpdateCallback = new AdapterListUpdateCallback(adapter);
4242
this.mConfig = new AsyncDifferConfig.Builder<>(diffCallback).build();
4343
this.mListChangedCallback = listChangedCallback;
4444
updateCurrentList(new ArrayList<T>());
4545
}
4646

47-
48-
4947
void submitList(@Nullable final List<T> newList) {
5048
final long runGeneration = ++this.mMaxScheduledGeneration;
5149
mGenerations.add(runGeneration);
52-
Log.d(TAG,"latchList submitList runGeneration add :"+runGeneration+";;size"+mGenerations.size());
50+
Log.d(TAG, "latchList submitList runGeneration add :" + runGeneration + ";;size" + mGenerations.size());
5351
if (newList != this.mOldList) {
5452
if (newList == null) {
5553
int countRemoved = this.mOldList.size();
5654
syncOldList(null);
5755
updateCurrentList(new ArrayList<T>());
5856
this.mUpdateCallback.onRemoved(0, countRemoved);
5957
mGenerations.remove(runGeneration);
60-
Log.d(TAG,"latchList submitList newList == null runGeneration :"+runGeneration+";;size"+mGenerations.size());
58+
Log.d(TAG, "latchList submitList newList == null runGeneration :" + runGeneration + ";;size" +
59+
mGenerations.size());
6160
} else if (this.mOldList == null) {
6261
syncOldList(newList);
6362
updateSyncTime(newList);
6463
updateCurrentList(new ArrayList<>(newList));
6564
this.mUpdateCallback.onInserted(0, newList.size());
6665
mGenerations.remove(runGeneration);
67-
Log.d(TAG,"latchList submitList mOldList == null runGeneration :"+runGeneration+";;size"+mGenerations.size());
66+
Log.d(TAG, "latchList submitList mOldList == null runGeneration :" + runGeneration + ";;size" +
67+
mGenerations.size());
6868
} else {
69-
doDiff(newList,runGeneration);
69+
doDiff(newList, runGeneration);
7070
}
7171
}
7272
}
7373

74-
private void doDiff(@NonNull final List<T> newList,final long runGeneration) {
74+
private void doDiff(@NonNull final List<T> newList, final long runGeneration) {
75+
76+
if (this.mOldList == null) {
77+
return;
78+
}
79+
7580
final List<T> oldList = new ArrayList<>(this.mOldList);
7681

7782
this.mConfig.getBackgroundThreadExecutor().execute(new Runnable() {
@@ -82,19 +87,22 @@ public void run() {
8287
public int getOldListSize() {
8388
return oldList.size();
8489
}
90+
8591
@Override
8692
public int getNewListSize() {
8793
return newList.size();
8894
}
95+
8996
@Override
9097
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
9198

9299
T oldItem = oldList.get(oldItemPosition);
93100
T newItem = newList.get(newItemPosition);
94-
if(oldItem == null || newItem == null) {
101+
if (oldItem == null || newItem == null) {
95102
return false;
96103
}
97-
if(oldItem.getItemViewId()!=newItem.getItemViewId() || oldItem.getClass() != newItem.getClass()) {
104+
if (oldItem.getItemViewId() != newItem.getItemViewId() ||
105+
oldItem.getClass() != newItem.getClass()) {
98106
return false;
99107
}
100108
return AsyncListUpdateDiffer.this.mConfig.getDiffCallback().areItemsTheSame(oldItem, newItem);
@@ -105,32 +113,37 @@ public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
105113

106114
T oldItem = oldList.get(oldItemPosition);
107115
T newItem = newList.get(newItemPosition);
108-
if (oldItem != null && newItem != null && oldItem.getClass() == newItem.getClass() ) {
109-
return AsyncListUpdateDiffer.this.mConfig.getDiffCallback().areContentsTheSame(oldItem, newItem);
110-
} else {
116+
if (oldItem != null && newItem != null && oldItem.getClass() == newItem.getClass()) {
117+
return AsyncListUpdateDiffer.this.mConfig.getDiffCallback()
118+
.areContentsTheSame(oldItem, newItem);
119+
} else {
111120
return oldItem == null && newItem == null;
112121
}
113122
}
123+
114124
@Override
115125
@Nullable
116126
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
117127
T oldItem = oldList.get(oldItemPosition);
118128
T newItem = newList.get(newItemPosition);
119129
if (oldItem != null && newItem != null && oldItem.getClass() == newItem.getClass()) {
120-
return AsyncListUpdateDiffer.this.mConfig.getDiffCallback().getChangePayload(oldItem, newItem);
130+
return AsyncListUpdateDiffer.this.mConfig.getDiffCallback()
131+
.getChangePayload(oldItem, newItem);
121132
} else {
122133
return null;
123134
}
124135
}
125136
});
126-
mDiffHandler.post( new Runnable() {
137+
mDiffHandler.post(new Runnable() {
127138
@Override
128139
public void run() {
129140
if (AsyncListUpdateDiffer.this.mMaxScheduledGeneration == runGeneration) {
130-
AsyncListUpdateDiffer.this.latchList(newList, result,runGeneration);
131-
Log.d(TAG,"latchList doDiff runGeneration :"+runGeneration+";;size"+mGenerations.size());
141+
AsyncListUpdateDiffer.this.latchList(newList, result, runGeneration);
142+
Log.d(TAG, "latchList doDiff runGeneration :" + runGeneration + ";;size" +
143+
mGenerations.size());
132144
} else {
133-
Log.d(TAG,"latchList doDiff else runGeneration :"+runGeneration+";;size"+mGenerations.size());
145+
Log.d(TAG, "latchList doDiff else runGeneration :" + runGeneration + ";;size" +
146+
mGenerations.size());
134147
mGenerations.remove(runGeneration);
135148
}
136149
}
@@ -139,17 +152,18 @@ public void run() {
139152
});
140153
}
141154

142-
private void latchList(@NonNull final List<T> newList, @NonNull final DiffUtil.DiffResult diffResult,final long runGeneration) {
155+
private void latchList(@NonNull final List<T> newList, @NonNull final DiffUtil.DiffResult diffResult,
156+
final long runGeneration) {
143157

144-
long needDelay = mCanSyncTime - SystemClock.elapsedRealtime() ;
145-
if(needDelay <= 0) {
158+
long needDelay = mCanSyncTime - SystemClock.elapsedRealtime();
159+
if (needDelay <= 0) {
146160

147161
syncOldList(newList);
148162
updateSyncTime(newList);
149163
updateCurrentList(new ArrayList<>(newList));
150164
diffResult.dispatchUpdatesTo(AsyncListUpdateDiffer.this.mUpdateCallback);
151165
mGenerations.remove(runGeneration);
152-
Log.d(TAG,"latchList needDelay <= 0 runGeneration :"+runGeneration+";;size"+mGenerations.size());
166+
Log.d(TAG, "latchList needDelay <= 0 runGeneration :" + runGeneration + ";;size" + mGenerations.size());
153167

154168
} else {
155169

@@ -165,29 +179,28 @@ public void run() {
165179
diffResult.dispatchUpdatesTo(AsyncListUpdateDiffer.this.mUpdateCallback);
166180

167181
}
168-
Log.d(TAG,"latchList else runGeneration :"+runGeneration+";;size"+mGenerations.size());
182+
Log.d(TAG, "latchList else runGeneration :" + runGeneration + ";;size" + mGenerations.size());
169183
mGenerations.remove(runGeneration);
170184
}
171-
}, needDelay );
185+
}, needDelay);
172186
}
173187

174188
}
175189

176-
177-
void updateOldListSize(final @NonNull Runnable listSizeRunnable , final List<T> oldDatas) {
178-
if(mGenerations.size() > 0) {
190+
void updateOldListSize(final @NonNull Runnable listSizeRunnable, final List<T> oldDatas) {
191+
if (mGenerations.size() > 0) {
179192
return;
180193
}
181194

182195
long currentTimeMillis = SystemClock.elapsedRealtime();
183196

184-
if(currentTimeMillis >= mCanSyncTime) {
197+
if (currentTimeMillis >= mCanSyncTime) {
185198

186199
listSizeRunnable.run();
187200
syncOldList(oldDatas);
188201

189-
}else {
190-
final long runGeneration = AsyncListUpdateDiffer.this.mMaxScheduledGeneration;
202+
} else {
203+
final long runGeneration = AsyncListUpdateDiffer.this.mMaxScheduledGeneration;
191204
mDiffHandler.postDelayed(new Runnable() {
192205
@Override
193206
public void run() {
@@ -198,20 +211,20 @@ public void run() {
198211
syncOldList(oldDatas);
199212
}
200213
}
201-
}, mCanSyncTime - currentTimeMillis );
214+
}, mCanSyncTime - currentTimeMillis);
202215
}
203216
}
204217

205218
private void updateCurrentList(List<T> currentList) {
206219
this.mListChangedCallback.onListChanged(currentList);
207220
}
208221

209-
private void syncOldList(@Nullable List<T> oldData) {
222+
private void syncOldList(@Nullable List<T> oldData) {
210223
this.mOldList = oldData;
211224
}
212225

213-
private void updateSyncTime(@Nullable List<T> oldData) {
214-
mCanSyncTime = SystemClock.elapsedRealtime() + (oldData!=null?oldData.size() * DELAY_STEP:0) ;
226+
private void updateSyncTime(@Nullable List<T> oldData) {
227+
mCanSyncTime = SystemClock.elapsedRealtime() + (oldData != null ? oldData.size() * DELAY_STEP : 0);
215228
}
216229

217230

0 commit comments

Comments
 (0)