From fa854cf369a53bb15305cda72c9912df126cc374 Mon Sep 17 00:00:00 2001 From: shichaohui <464206200@qq.com> Date: Mon, 22 Jul 2019 14:30:09 +0800 Subject: [PATCH 01/14] Ignore OS generated files. --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 0bc28625a..834898606 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,11 @@ +#///////////////////////////////////////////////////////////////////////////// +# OS generated files +#///////////////////////////////////////////////////////////////////////////// + +.DS_Store +ehthumbs.db +Thumbs.db + # Built application files *.apk *.ap_ From 29e77937fbdeb3a215dee2765c9bd5e42078d4eb Mon Sep 17 00:00:00 2001 From: shichaohui <464206200@qq.com> Date: Mon, 22 Jul 2019 14:37:20 +0800 Subject: [PATCH 02/14] Fix bug #2361 . --- .../library/adapter/base/BaseMultiItemQuickAdapter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java index d463452d0..3949a3b84 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java @@ -4,8 +4,10 @@ import android.support.annotation.LayoutRes; import android.util.SparseIntArray; import android.view.ViewGroup; + import com.chad.library.adapter.base.entity.IExpandable; import com.chad.library.adapter.base.entity.MultiItemEntity; + import java.util.List; /** @@ -102,7 +104,9 @@ protected void removeDataFromParent(T child) { int position = getParentPosition(child); if (position >= 0) { IExpandable parent = (IExpandable) mData.get(position); - parent.getSubItems().remove(child); + if (parent != child) { + parent.getSubItems().remove(child); + } } } From 19a8b4fd574f01af34e95d25c58b018121e0173d Mon Sep 17 00:00:00 2001 From: shichaohui <464206200@qq.com> Date: Mon, 22 Jul 2019 16:48:22 +0800 Subject: [PATCH 03/14] Fix bug #2377 . --- .../adapter/base/BaseQuickAdapter.java | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java index b8b288057..252e3e1a6 100755 --- a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java @@ -1883,34 +1883,25 @@ public void expandAll() { @SuppressWarnings("unchecked") private int recursiveCollapse(@IntRange(from = 0) int position) { T item = getItem(position); - if (!isExpandable(item)) { + if (item == null || !isExpandable(item)) { return 0; } IExpandable expandable = (IExpandable) item; - int subItemCount = 0; - if (expandable.isExpanded()) { - List subItems = expandable.getSubItems(); - if (null == subItems) return 0; - - for (int i = subItems.size() - 1; i >= 0; i--) { - T subItem = subItems.get(i); - int pos = getItemPosition(subItem); - if (pos < 0) { - continue; - } else if (pos < position) { - pos = position + i + 1; - if (pos >= mData.size()) { - continue; - } - } - if (subItem instanceof IExpandable) { - subItemCount += recursiveCollapse(pos); - } - mData.remove(pos); - subItemCount++; + if (!expandable.isExpanded()) { + return 0; + } + List collapseList = new ArrayList<>(); + int itemLevel = expandable.getLevel(); + T itemTemp; + for (int i = position + 1, n = mData.size(); i < n; i++) { + itemTemp = mData.get(i); + if (itemTemp instanceof IExpandable && ((IExpandable) itemTemp).getLevel() == itemLevel) { + break; } + collapseList.add(itemTemp); } - return subItemCount; + mData.removeAll(collapseList); + return collapseList.size(); } /** From bc09367dc958a8d1106c7417825f03c017afcdf6 Mon Sep 17 00:00:00 2001 From: limuyang Date: Tue, 23 Jul 2019 21:13:10 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20proguard=EF=BC=8Clib?= =?UTF-8?q?=E8=87=AA=E5=B8=A6=E6=B7=B7=E6=B7=86=E8=A7=84=E5=88=99=E3=80=82?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=8D=E9=9C=80=E8=A6=81=E5=86=8D=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE=E6=B7=B7=E6=B7=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/proguard-rules.pro | 8 -------- gradle/wrapper/gradle-wrapper.properties | 2 +- library/build.gradle | 3 +-- library/proguard-rules.pro | 8 ++++++++ 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index aad001d60..743dfc188 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,11 +16,3 @@ # public *; #} #BaseRecyclerViewAdapterHelper --keep class com.chad.library.adapter.** { -*; -} --keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter --keep public class * extends com.chad.library.adapter.base.BaseViewHolder --keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder { - (android.view.View); -} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6b1884fa..c0e885096 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index 78add0500..46e91ae26 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -10,8 +10,7 @@ android { } buildTypes { release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + consumerProguardFiles 'proguard-rules.pro' } } lintOptions { diff --git a/library/proguard-rules.pro b/library/proguard-rules.pro index 7a213e727..f48dba692 100644 --- a/library/proguard-rules.pro +++ b/library/proguard-rules.pro @@ -15,3 +15,11 @@ #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} +-keep class com.chad.library.adapter.** { +*; +} +-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter +-keep public class * extends com.chad.library.adapter.base.BaseViewHolder +-keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder { + (android.view.View); +} \ No newline at end of file From 338b2bcfeaa6d8fabef7bed41c6deaba37855d35 Mon Sep 17 00:00:00 2001 From: limuyang Date: Tue, 23 Jul 2019 23:25:58 +0800 Subject: [PATCH 05/14] Add Async Diff --- .../DiffUtilActivity.java | 4 +- .../adapter/base/BaseQuickAdapter.java | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java index 97dd86056..69fbf9e65 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java @@ -3,9 +3,7 @@ import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.View; -import android.view.ViewGroup; import android.widget.Button; -import android.widget.TextView; import com.chad.baserecyclerviewadapterhelper.adapter.diffUtil.DiffDemoCallback; import com.chad.baserecyclerviewadapterhelper.adapter.diffUtil.DiffUtilAdapter; @@ -61,6 +59,8 @@ private void initClick() { public void onClick(View v) { DiffDemoCallback callback = new DiffDemoCallback(getNewList()); mAdapter.setNewDiffData(callback); + // use async + // mAdapter.setNewDiffDataAsync(callback, mRecyclerView); } }); diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java index 252e3e1a6..76ed6a069 100755 --- a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java @@ -52,6 +52,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; @@ -533,6 +534,48 @@ public void setNewDiffData(@NonNull BaseQuickDiffCallback baseQuickDiffCallba mData = baseQuickDiffCallback.getNewList(); } + /** + * use Diff setting up a new instance to data (with async) + * @param baseQuickDiffCallback implementation {@link BaseQuickDiffCallback}. + * @param recyclerView RecyclerView + */ + public void setNewDiffDataAsync(@NonNull BaseQuickDiffCallback baseQuickDiffCallback, @NonNull RecyclerView recyclerView) { + setNewDiffDataAsync(baseQuickDiffCallback, false, recyclerView); + } + + /** + * use Diff setting up a new instance to data (with async) + * @param baseQuickDiffCallback implementation {@link BaseQuickDiffCallback}. + * @param detectMoves Whether to detect the movement of the Item + * @param recyclerView RecyclerView + */ + public void setNewDiffDataAsync(@NonNull BaseQuickDiffCallback baseQuickDiffCallback, boolean detectMoves, @NonNull final RecyclerView recyclerView) { + if (getEmptyViewCount() == 1) { + // If the current view is an empty view, set the new data directly without diff + setNewData(baseQuickDiffCallback.getNewList()); + return; + } + final BaseQuickDiffCallback finalCallback = baseQuickDiffCallback; + final boolean finalDetectMoves = detectMoves; + finalCallback.setOldList(this.getData()); + new Thread(new Runnable() { + @Override + public void run() { + WeakReference rfRecyclerView = new WeakReference<>(recyclerView); + final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(finalCallback, finalDetectMoves); + if (rfRecyclerView.get() != null) { + rfRecyclerView.get().post(new Runnable() { + @Override + public void run() { + diffResult.dispatchUpdatesTo(new BaseQuickAdapterListUpdateCallback(BaseQuickAdapter.this)); + mData = finalCallback.getNewList(); + } + }); + } + } + }).start(); + } + /** * insert a item associated with the specified position of adapter * From df78944cb638feab279798a30fed66b721c847a4 Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 17:11:36 +0800 Subject: [PATCH 06/14] Add annotation --- .../adapter/AnimationAdapter.java | 3 ++- .../adapter/DataBindingUseAdapter.java | 3 ++- .../adapter/ExpandableItemAdapter.java | 3 ++- .../adapter/HeaderAndFooterAdapter.java | 4 +++- .../baserecyclerviewadapterhelper/adapter/HomeAdapter.java | 4 +++- .../adapter/ItemClickAdapter.java | 3 ++- .../adapter/ItemDragAdapter.java | 4 +++- .../adapter/MultipleItemQuickAdapter.java | 3 ++- .../baserecyclerviewadapterhelper/adapter/NestAdapter.java | 3 ++- .../adapter/PullToRefreshAdapter.java | 3 ++- .../baserecyclerviewadapterhelper/adapter/QuickAdapter.java | 4 +++- .../adapter/SectionAdapter.java | 4 +++- .../adapter/SectionMultipleItemAdapter.java | 4 +++- .../adapter/diffUtil/DiffUtilAdapter.java | 2 +- .../base/BaseDataBindingAdapter.java | 3 ++- .../chad/library/adapter/base/BaseItemDraggableAdapter.java | 2 +- .../com/chad/library/adapter/base/BaseQuickAdapter.java | 6 +++--- .../adapter/base/BaseSectionMultiItemQuickAdapter.java | 3 ++- .../chad/library/adapter/base/BaseSectionQuickAdapter.java | 3 ++- .../chad/library/adapter/base/MultipleItemRvAdapter.java | 3 ++- 20 files changed, 45 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java index 33d2a5813..c80ea044a 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; import android.text.TextPaint; import android.text.style.ClickableSpan; import android.view.View; @@ -29,7 +30,7 @@ public AnimationAdapter() { } @Override - protected void convert(BaseViewHolder helper, Status item) { + protected void convert(@NonNull BaseViewHolder helper, Status item) { helper.addOnClickListener(R.id.img).addOnClickListener(R.id.tweetName); switch (helper.getLayoutPosition() % 3) { case 0: diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java index 5d61c91f9..13a025e54 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java @@ -2,6 +2,7 @@ import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; +import android.support.annotation.NonNull; import android.view.View; import android.view.ViewGroup; @@ -29,7 +30,7 @@ public DataBindingUseAdapter(int layoutResId, List data) { } @Override - protected void convert(MovieViewHolder helper, Movie item) { + protected void convert(@NonNull MovieViewHolder helper, Movie item) { ViewDataBinding binding = helper.getBinding(); binding.setVariable(BR.movie, item); binding.setVariable(BR.presenter, mPresenter); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java index 515682889..528f57dc4 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; import android.util.Log; import android.view.View; @@ -39,7 +40,7 @@ public ExpandableItemAdapter(List data) { @Override - protected void convert(final BaseViewHolder holder, final MultiItemEntity item) { + protected void convert(@NonNull final BaseViewHolder holder, final MultiItemEntity item) { switch (holder.getItemViewType()) { case TYPE_LEVEL_0: switch (holder.getLayoutPosition() % 3) { diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HeaderAndFooterAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HeaderAndFooterAdapter.java index 7d9287dc2..aa366b2b0 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HeaderAndFooterAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HeaderAndFooterAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.data.DataServer; import com.chad.baserecyclerviewadapterhelper.entity.Status; @@ -16,7 +18,7 @@ public HeaderAndFooterAdapter(int dataSize) { } @Override - protected void convert(BaseViewHolder helper, Status item) { + protected void convert(@NonNull BaseViewHolder helper, Status item) { switch (helper.getLayoutPosition() % 3) { case 0: diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HomeAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HomeAdapter.java index 4bf629b0c..b919bbd1a 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HomeAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/HomeAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.HomeItem; import com.chad.library.adapter.base.BaseQuickAdapter; @@ -16,7 +18,7 @@ public HomeAdapter(int layoutResId, List data) { } @Override - protected void convert(BaseViewHolder helper, HomeItem item) { + protected void convert(@NonNull BaseViewHolder helper, HomeItem item) { helper.setText(R.id.text, item.getTitle()); helper.setImageResource(R.id.icon, item.getImageResource()); } diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemClickAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemClickAdapter.java index d23ed4e65..ffbe3e955 100755 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemClickAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemClickAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -33,7 +34,7 @@ public ItemClickAdapter(List data) { @Override - protected void convert(final BaseViewHolder helper, final ClickEntity item) { + protected void convert(@NonNull final BaseViewHolder helper, final ClickEntity item) { switch (helper.getItemViewType()) { case ClickEntity.CLICK_ITEM_VIEW: helper.addOnClickListener(R.id.btn); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemDragAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemDragAdapter.java index 15c3465b8..ecb4aead2 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemDragAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ItemDragAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.library.adapter.base.BaseItemDraggableAdapter; import com.chad.library.adapter.base.BaseViewHolder; @@ -15,7 +17,7 @@ public ItemDragAdapter(List data) { } @Override - protected void convert(BaseViewHolder helper, String item) { + protected void convert(@NonNull BaseViewHolder helper, String item) { switch (helper.getLayoutPosition() % 3) { case 0: helper.setImageResource(R.id.iv_head, R.mipmap.head_img0); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java index a77ec063b..ad0bfb83c 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java @@ -1,6 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; import android.content.Context; +import android.support.annotation.NonNull; import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.MultipleItem; @@ -23,7 +24,7 @@ public MultipleItemQuickAdapter(Context context, List data) { } @Override - protected void convert(BaseViewHolder helper, MultipleItem item) { + protected void convert(@NonNull BaseViewHolder helper, MultipleItem item) { switch (helper.getItemViewType()) { case MultipleItem.TEXT: helper.setText(R.id.tv, item.getContent()); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java index 9b0e74f7a..08c6daee8 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; @@ -29,7 +30,7 @@ public NestAdapter() { } @Override - protected void convert(BaseViewHolder helper, Status item) { + protected void convert(@NonNull BaseViewHolder helper, Status item) { helper.addOnClickListener(R.id.tweetText); switch (helper.getLayoutPosition() % 3) { case 0: diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java index 27e59dc7a..966b3d3bd 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; @@ -28,7 +29,7 @@ public PullToRefreshAdapter() { } @Override - protected void convert(BaseViewHolder helper, Status item) { + protected void convert(@NonNull BaseViewHolder helper, Status item) { switch (helper.getLayoutPosition() % 3) { case 0: helper.setImageResource(R.id.img, R.mipmap.animation_img1); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/QuickAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/QuickAdapter.java index 9bfc4528f..a43f07769 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/QuickAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/QuickAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.data.DataServer; import com.chad.baserecyclerviewadapterhelper.entity.Status; @@ -16,7 +18,7 @@ public QuickAdapter(int dataSize) { } @Override - protected void convert(BaseViewHolder helper, Status item) { + protected void convert(@NonNull BaseViewHolder helper, Status item) { switch (helper.getLayoutPosition() % 3) { case 0: helper.setImageResource(R.id.img, R.mipmap.animation_img1); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionAdapter.java index eee52c3c6..715369f15 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.MySection; import com.chad.baserecyclerviewadapterhelper.entity.Video; @@ -33,7 +35,7 @@ protected void convertHead(BaseViewHolder helper, final MySection item) { @Override - protected void convert(BaseViewHolder helper, MySection item) { + protected void convert(@NonNull BaseViewHolder helper, MySection item) { Video video = (Video) item.t; switch (helper.getLayoutPosition() % 2) { case 0: diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionMultipleItemAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionMultipleItemAdapter.java index d950829ab..1ce8385d6 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionMultipleItemAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/SectionMultipleItemAdapter.java @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import android.support.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.MultipleItem; import com.chad.baserecyclerviewadapterhelper.entity.SectionMultipleItem; @@ -35,7 +37,7 @@ protected void convertHead(BaseViewHolder helper, final SectionMultipleItem item } @Override - protected void convert(BaseViewHolder helper, SectionMultipleItem item) { + protected void convert(@NonNull BaseViewHolder helper, SectionMultipleItem item) { // deal with multiple type items viewHolder helper.addOnClickListener(R.id.card_view); switch (helper.getItemViewType()) { diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/diffUtil/DiffUtilAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/diffUtil/DiffUtilAdapter.java index aac508e08..1d5f923cf 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/diffUtil/DiffUtilAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/diffUtil/DiffUtilAdapter.java @@ -22,7 +22,7 @@ public DiffUtilAdapter(List list) { } @Override - protected void convert(BaseViewHolder helper, DiffUtilDemoEntity item) { + protected void convert(@NonNull BaseViewHolder helper, DiffUtilDemoEntity item) { helper.setText(R.id.tweetName, item.getTitle()) .setText(R.id.tweetText, item.getContent()) .setText(R.id.tweetDate, item.getDate()); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java index 230f253d7..0f00850a7 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java @@ -3,6 +3,7 @@ import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; @@ -53,7 +54,7 @@ protected BaseBindingViewHolder createBaseViewHolder(ViewGroup parent, int la } @Override - protected void convert(BaseBindingViewHolder helper, T item) { + protected void convert(@NonNull BaseBindingViewHolder helper, T item) { convert(helper.getBinding(), item); helper.getBinding().executePendingBindings(); } diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java index 57adda900..e8cb0cfb3 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java @@ -53,7 +53,7 @@ public BaseItemDraggableAdapter(int layoutResId, List data) { * @see #getDefItemViewType(int) */ @Override - public void onBindViewHolder(K holder, int position) { + public void onBindViewHolder(@NonNull K holder, int position) { super.onBindViewHolder(holder, position); int viewType = holder.getItemViewType(); diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java index 76ed6a069..5c66dba57 100755 --- a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java @@ -904,7 +904,7 @@ public void enableLoadMoreEndClick(boolean enable) { * @param holder */ @Override - public void onViewAttachedToWindow(K holder) { + public void onViewAttachedToWindow(@NonNull K holder) { super.onViewAttachedToWindow(holder); int type = holder.getItemViewType(); if (type == EMPTY_VIEW || type == HEADER_VIEW || type == FOOTER_VIEW || type == LOADING_VIEW) { @@ -931,7 +931,7 @@ protected void setFullSpan(RecyclerView.ViewHolder holder) { } @Override - public void onAttachedToRecyclerView(final RecyclerView recyclerView) { + public void onAttachedToRecyclerView(@NonNull final RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if (manager instanceof GridLayoutManager) { @@ -1002,7 +1002,7 @@ public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) { * @see #getDefItemViewType(int) */ @Override - public void onBindViewHolder(K holder, int position) { + public void onBindViewHolder(@NonNull K holder, int position) { //Add up fetch logic, almost like load more, but simpler. autoUpFetch(position); //Do not move position, need to change before LoadMoreView binding diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseSectionMultiItemQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseSectionMultiItemQuickAdapter.java index 858baa08c..d95546a09 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseSectionMultiItemQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseSectionMultiItemQuickAdapter.java @@ -2,6 +2,7 @@ import android.support.annotation.IntRange; import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; import android.util.SparseIntArray; import android.view.ViewGroup; @@ -86,7 +87,7 @@ protected boolean isFixedViewType(int type) { } @Override - public void onBindViewHolder(K holder, int position) { + public void onBindViewHolder(@NonNull K holder, int position) { switch (holder.getItemViewType()) { case SECTION_HEADER_VIEW: setFullSpan(holder); diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseSectionQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseSectionQuickAdapter.java index f3a3a0832..18c0ca409 100755 --- a/library/src/main/java/com/chad/library/adapter/base/BaseSectionQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseSectionQuickAdapter.java @@ -1,5 +1,6 @@ package com.chad.library.adapter.base; +import android.support.annotation.NonNull; import android.view.ViewGroup; import com.chad.library.adapter.base.entity.SectionEntity; @@ -47,7 +48,7 @@ protected boolean isFixedViewType(int type) { } @Override - public void onBindViewHolder(K holder, int position) { + public void onBindViewHolder(@NonNull K holder, int position) { switch (holder.getItemViewType()) { case SECTION_HEADER_VIEW: setFullSpan(holder); diff --git a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java index 5fc69f54c..9cab9b622 100644 --- a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java @@ -1,5 +1,6 @@ package com.chad.library.adapter.base; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.SparseArray; import android.view.View; @@ -60,7 +61,7 @@ protected int getItemType(T t) { public abstract void registerItemProvider(); @Override - protected void convert(V helper, T item) { + protected void convert(@NonNull V helper, T item) { int itemViewType = helper.getItemViewType(); BaseItemProvider provider = mItemProviders.get(itemViewType); From 1ede17cde931dc16b9e6859911b2b5de1ce28f48 Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 18:42:07 +0800 Subject: [PATCH 07/14] Change the way asynchronous diff is used --- app/build.gradle | 1 + .../DiffUtilActivity.java | 30 +++++++++-- brvahKtx/.gitignore | 1 + brvahKtx/build.gradle | 33 ++++++++++++ brvahKtx/proguard-rules.pro | 31 ++++++++++++ brvahKtx/src/main/AndroidManifest.xml | 2 + .../com/chinakingo/brvahktx/AdapterKtx.kt | 29 +++++++++++ brvahKtx/src/main/res/values/strings.xml | 3 ++ build.gradle | 7 ++- .../adapter/base/BaseQuickAdapter.java | 50 ++++++------------- settings.gradle | 2 +- 11 files changed, 145 insertions(+), 44 deletions(-) create mode 100644 brvahKtx/.gitignore create mode 100644 brvahKtx/build.gradle create mode 100644 brvahKtx/proguard-rules.pro create mode 100644 brvahKtx/src/main/AndroidManifest.xml create mode 100644 brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt create mode 100644 brvahKtx/src/main/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index d18f47608..66302c38f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,7 @@ android { dependencies { implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') implementation project(path: ':library') + implementation project(path: ':brvahKtx') implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java index 69fbf9e65..603bc47ce 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java @@ -57,10 +57,34 @@ private void initClick() { itemChangeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - DiffDemoCallback callback = new DiffDemoCallback(getNewList()); + List newData = getNewList(); + DiffDemoCallback callback = new DiffDemoCallback(newData); mAdapter.setNewDiffData(callback); - // use async - // mAdapter.setNewDiffDataAsync(callback, mRecyclerView); + + /* + Use async example. + The user performs the diff calculation in the child thread and informs the adapter of the result. + Warning: You should do multi-thread management yourself to prevent memory leaks. + + 异步使用diff刷新 + 用户自己在子线程中进行diff计算,将结果告知adapter即可 + 警告:你应该自己进行多线程管理,防止内存泄漏 + */ +// new Thread(new Runnable() { +// @Override +// public void run() { +// final List newData = getNewList(); +// DiffDemoCallback callback = new DiffDemoCallback(newData); +// final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback, false); +// runOnUiThread(new Runnable() { +// @Override +// public void run() { +// mAdapter.setNewDiffData(diffResult, newData); +// } +// }); +// } +// }).start(); + } }); diff --git a/brvahKtx/.gitignore b/brvahKtx/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/brvahKtx/.gitignore @@ -0,0 +1 @@ +/build diff --git a/brvahKtx/build.gradle b/brvahKtx/build.gradle new file mode 100644 index 000000000..d7ec71326 --- /dev/null +++ b/brvahKtx/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 17 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + consumerProguardFiles 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + compileOnly 'com.android.support:recyclerview-v7:28.0.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-RC' + implementation project(path: ':library') +} diff --git a/brvahKtx/proguard-rules.pro b/brvahKtx/proguard-rules.pro new file mode 100644 index 000000000..97a05a301 --- /dev/null +++ b/brvahKtx/proguard-rules.pro @@ -0,0 +1,31 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile +# ServiceLoader support +-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} +-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} +-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {} +-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {} + +# Most of volatile fields are updated with AFU and should not be mangled +-keepclassmembernames class kotlinx.** { + volatile ; +} \ No newline at end of file diff --git a/brvahKtx/src/main/AndroidManifest.xml b/brvahKtx/src/main/AndroidManifest.xml new file mode 100644 index 000000000..ede31adea --- /dev/null +++ b/brvahKtx/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt b/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt new file mode 100644 index 000000000..ee812b6a7 --- /dev/null +++ b/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt @@ -0,0 +1,29 @@ +package com.chinakingo.brvahktx + +import android.support.v7.util.DiffUtil +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.chad.library.adapter.base.diff.BaseQuickDiffCallback +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/** + * author : limuyang + * e-mail : limuyang2@163.com + * date : 2019/07/28 + * desc : About the kotlin extension of the adapter + */ + +/** + * this is kotlin Expansion, quick use async diff + * @receiver BaseQuickAdapter + * @param baseQuickDiffCallback BaseQuickDiffCallback + * @param detectMoves Boolean + */ +suspend inline fun BaseQuickAdapter.setNewDiffDataAsync(baseQuickDiffCallback: BaseQuickDiffCallback, detectMoves: Boolean) { + baseQuickDiffCallback.oldList = this.data + val diffResult = withContext(Dispatchers.IO) { + DiffUtil.calculateDiff(baseQuickDiffCallback, detectMoves) + } + this.setNewDiffData(diffResult, baseQuickDiffCallback.newList) +} \ No newline at end of file diff --git a/brvahKtx/src/main/res/values/strings.xml b/brvahKtx/src/main/res/values/strings.xml new file mode 100644 index 000000000..a6e3ed648 --- /dev/null +++ b/brvahKtx/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + brvahKtx + diff --git a/build.gradle b/build.gradle index 2d4a79afe..56902f9dc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,12 @@ buildscript { + ext.kotlin_version = '1.3.41' repositories { google() jcenter() - mavenLocal() - mavenCentral() - } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.4.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java index 5c66dba57..9d47b154b 100755 --- a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java @@ -52,7 +52,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.lang.ref.WeakReference; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; @@ -517,7 +516,8 @@ public void setNewDiffData(@NonNull BaseQuickDiffCallback baseQuickDiffCallba } /** - * use Diff setting up a new instance to data + * use Diff setting up a new instance to data. + * this is sync, if you need use async, see {@link #setNewDiffData(DiffUtil.DiffResult, List)}. * * @param baseQuickDiffCallback implementation {@link BaseQuickDiffCallback}. * @param detectMoves Whether to detect the movement of the Item @@ -535,45 +535,23 @@ public void setNewDiffData(@NonNull BaseQuickDiffCallback baseQuickDiffCallba } /** - * use Diff setting up a new instance to data (with async) - * @param baseQuickDiffCallback implementation {@link BaseQuickDiffCallback}. - * @param recyclerView RecyclerView - */ - public void setNewDiffDataAsync(@NonNull BaseQuickDiffCallback baseQuickDiffCallback, @NonNull RecyclerView recyclerView) { - setNewDiffDataAsync(baseQuickDiffCallback, false, recyclerView); - } - - /** - * use Diff setting up a new instance to data (with async) - * @param baseQuickDiffCallback implementation {@link BaseQuickDiffCallback}. - * @param detectMoves Whether to detect the movement of the Item - * @param recyclerView RecyclerView + * use DiffResult setting up a new instance to data + * + * If you need to use async computing Diff, please use this method. + * You only need to tell the calculation result, + * this adapter does not care about the calculation process. + * + * @param diffResult DiffResult + * @param newData New Data */ - public void setNewDiffDataAsync(@NonNull BaseQuickDiffCallback baseQuickDiffCallback, boolean detectMoves, @NonNull final RecyclerView recyclerView) { + public void setNewDiffData(@NonNull DiffUtil.DiffResult diffResult, @NonNull List newData) { if (getEmptyViewCount() == 1) { // If the current view is an empty view, set the new data directly without diff - setNewData(baseQuickDiffCallback.getNewList()); + setNewData(newData); return; } - final BaseQuickDiffCallback finalCallback = baseQuickDiffCallback; - final boolean finalDetectMoves = detectMoves; - finalCallback.setOldList(this.getData()); - new Thread(new Runnable() { - @Override - public void run() { - WeakReference rfRecyclerView = new WeakReference<>(recyclerView); - final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(finalCallback, finalDetectMoves); - if (rfRecyclerView.get() != null) { - rfRecyclerView.get().post(new Runnable() { - @Override - public void run() { - diffResult.dispatchUpdatesTo(new BaseQuickAdapterListUpdateCallback(BaseQuickAdapter.this)); - mData = finalCallback.getNewList(); - } - }); - } - } - }).start(); + diffResult.dispatchUpdatesTo(new BaseQuickAdapterListUpdateCallback(BaseQuickAdapter.this)); + mData = newData; } /** diff --git a/settings.gradle b/settings.gradle index 33069973b..f0319ddf8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':library' +include ':app', ':library', ':brvahKtx' From 545f9a12c5ae9074151c99566604d0a04da410d9 Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 20:24:26 +0800 Subject: [PATCH 08/14] fix gradle --- app/build.gradle | 1 - brvahKtx/build.gradle | 2 +- brvahKtx/src/main/res/values/strings.xml | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 brvahKtx/src/main/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index 66302c38f..d18f47608 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,6 @@ android { dependencies { implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') implementation project(path: ':library') - implementation project(path: ':brvahKtx') implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' diff --git a/brvahKtx/build.gradle b/brvahKtx/build.gradle index d7ec71326..2d28ec7db 100644 --- a/brvahKtx/build.gradle +++ b/brvahKtx/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 28 defaultConfig { - minSdkVersion 17 + minSdkVersion 14 targetSdkVersion 28 versionCode 1 versionName "1.0" diff --git a/brvahKtx/src/main/res/values/strings.xml b/brvahKtx/src/main/res/values/strings.xml deleted file mode 100644 index a6e3ed648..000000000 --- a/brvahKtx/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - brvahKtx - From b6416fca0bf37da909b868b22088c734c7682bd6 Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 20:52:11 +0800 Subject: [PATCH 09/14] update proguard-rules --- library/proguard-rules.pro | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/library/proguard-rules.pro b/library/proguard-rules.pro index f48dba692..d150fb548 100644 --- a/library/proguard-rules.pro +++ b/library/proguard-rules.pro @@ -20,6 +20,7 @@ } -keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter -keep public class * extends com.chad.library.adapter.base.BaseViewHolder --keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder { - (android.view.View); -} \ No newline at end of file +-keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder { + (...); +} +-keepattributes InnerClasses \ No newline at end of file From 329a955b41e539866fcf2814ec34b7eb3f65fe7b Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 20:53:41 +0800 Subject: [PATCH 10/14] update README --- README-cn.md | 28 +++++++++++++++++++++++++++- README.md | 18 ++++++------------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/README-cn.md b/README-cn.md index 945aca0a9..9920e4005 100644 --- a/README-cn.md +++ b/README-cn.md @@ -42,7 +42,7 @@ 然后在dependencies添加: ``` dependencies { - compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46' + compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.47' } ``` ## [androidX 迁移库版本](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/releases/tag/2.9.45-androidx) @@ -495,6 +495,32 @@ mAdapter.setNewDiffData(callback); mAdapter.notifyItemChanged(0, "payload info"); ``` +## 异步Diff & 原始DiffUtil.Callback +用户可以直接使用`DiffUtil.Callback`,自己进行diff计算,将结果告知adapter即可。 +所以adapter并不关心diff计算过程,用户可以同步或是异步进行。 +使用如下方法: +```java +setNewDiffData(DiffUtil.DiffResult, List)} +``` +例子: +```java +new Thread(new Runnable() { + @Override + public void run() { + final List newData = getNewList(); + DiffDemoCallback callback = new DiffDemoCallback(newData); + final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback, false); + runOnUiThread(new Runnable() { + @Override + public void run() { + mAdapter.setNewDiffData(diffResult, newData); + } + }); + } +}).start(); +``` +>警告:你应该自己进行多线程管理,防止内存泄漏 + >**持续更新!,所以推荐Star项目** diff --git a/README.md b/README.md index 93e9c0120..18374fd63 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ kotlin demo :[BRVAH_kotlin](https://github.com/AllenCoder/BRVAH_kotlin) ## [androidX stable version ](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/releases/tag/2.9.45-androidx) # Document - [English](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki) -- [中文](http://www.jianshu.com/p/b343fcff51b0) +- [中文1](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/README-cn.md) +- [中文2](http://www.jianshu.com/p/b343fcff51b0) ## [UI](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/694) ## Demo @@ -20,17 +21,10 @@ kotlin demo :[BRVAH_kotlin](https://github.com/AllenCoder/BRVAH_kotlin) [国内下载地址](https://fir.im/s91g) # proguard-rules.pro -``` --keep class com.chad.library.adapter.** { -*; -} --keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter --keep public class * extends com.chad.library.adapter.base.BaseViewHolder --keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder { - (...); -} --keepattributes InnerClasses -``` +> 此资源库自带混淆规则,并且会自动导入,正常情况下无需手动导入。 +> The library comes with `proguard-rules.pro` rules and is automatically imported. Normally no manual import is required. +> You can also go here to view [proguard-rules](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/library/proguard-rules.pro) + # Extension library [PinnedSectionItemDecoration](https://github.com/oubowu/PinnedSectionItemDecoration) From 5830e16871eddb5eb544f669a3a9482a617b9e0c Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 21:13:55 +0800 Subject: [PATCH 11/14] update demo --- .../chad/baserecyclerviewadapterhelper/DiffUtilActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java index 603bc47ce..923e32e87 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java @@ -74,7 +74,7 @@ public void onClick(View v) { // @Override // public void run() { // final List newData = getNewList(); -// DiffDemoCallback callback = new DiffDemoCallback(newData); +// MyDiffCallback callback = new MyDiffCallback(newData, mAdapter.getData()); // final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback, false); // runOnUiThread(new Runnable() { // @Override From bb756fbc2f9a8296a30dcfb12df2399d54282786 Mon Sep 17 00:00:00 2001 From: limuyang Date: Sun, 28 Jul 2019 21:14:16 +0800 Subject: [PATCH 12/14] update README --- README-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-cn.md b/README-cn.md index 9920e4005..c240d88db 100644 --- a/README-cn.md +++ b/README-cn.md @@ -508,7 +508,7 @@ new Thread(new Runnable() { @Override public void run() { final List newData = getNewList(); - DiffDemoCallback callback = new DiffDemoCallback(newData); + MyDiffCallback callback = new MyDiffCallback(newData, mAdapter.getData()); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback, false); runOnUiThread(new Runnable() { @Override From 3c4d455f07b00ae17244040bec965f467422886d Mon Sep 17 00:00:00 2001 From: Allen Date: Sun, 28 Jul 2019 22:26:13 +0800 Subject: [PATCH 13/14] Update README-cn.md --- README-cn.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README-cn.md b/README-cn.md index c240d88db..6b24d7bcc 100644 --- a/README-cn.md +++ b/README-cn.md @@ -1,4 +1,4 @@ ->RecyclerView作为Android最常用的控件,受益群体几乎是所有Android开发者,希望更多开发者能够一起来维护这个项目,把这个项目做得更好,帮助更多人。**Star我的项目可加Q群558178792,申请的时候把GitHub的账号名字备注上否则不予通过,谢谢配合。**中国有句古话叫“授人以鱼不如授人以渔”,不仅仅提供使用,还写了如何实现的原理: +>RecyclerView作为Android最常用的控件,受益群体几乎是所有Android开发者,希望更多开发者能够一起来维护这个项目,把这个项目做得更好,帮助更多人。中国有句古话叫“授人以鱼不如授人以渔”,不仅仅提供使用,还写了如何实现的原理: - 「[RecyclerView.Adapter优化了吗?](http://www.jianshu.com/p/411ab861034f)」 - 「[BaseRecyclerAdapter之添加动画](http://www.jianshu.com/p/fa3f97c19263)」 - 「[BaseRecyclerAdapter之添加不同布局(头部尾部)](http://www.jianshu.com/p/9d75c22f0964)」 @@ -14,7 +14,7 @@ ![logo](http://upload-images.jianshu.io/upload_images/972352-1d77e0a75a4a7c0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 一个强大并且灵活的RecyclerViewAdapter,欢迎使用。(喜欢的可以**Star**一下) ## Google Play Demo - +## kotlin demo :[BRVAH_kotlin](https://github.com/AllenCoder/BRVAH_kotlin) [![Get it on Google Play](https://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=com.chad.baserecyclerviewadapterhelper) # 它能做什么?([下载 apk](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/raw/master/demo_res/demo.apk)) - **优化Adapter代码(减少百分之70%代码)** @@ -45,7 +45,7 @@ compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.47' } ``` -## [androidX 迁移库版本](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/releases/tag/2.9.45-androidx) +## [androidX 迁移库版本](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/releases/tag/2.9.47-androidx) # 如何使用它来创建Adapter? ![demo](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/demo_res/item_view.png) From 5db07fce1f5ff28b13db13b5f1ff2f217027004d Mon Sep 17 00:00:00 2001 From: "AllenCoder@126.com" Date: Sun, 28 Jul 2019 23:42:06 +0800 Subject: [PATCH 14/14] Merge branch 'androidx' of github.com:CymChad/BaseRecyclerViewAdapterHelper into androidx # Conflicts: # README-cn.md --- brvahKtx/build.gradle | 4 ++-- brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/brvahKtx/build.gradle b/brvahKtx/build.gradle index 2d28ec7db..88222e5d5 100644 --- a/brvahKtx/build.gradle +++ b/brvahKtx/build.gradle @@ -11,7 +11,7 @@ android { versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -26,7 +26,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - compileOnly 'com.android.support:recyclerview-v7:28.0.0' + compileOnly 'androidx.recyclerview:recyclerview:1.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-RC' implementation project(path: ':library') diff --git a/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt b/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt index ee812b6a7..dd4b11abf 100644 --- a/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt +++ b/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt @@ -1,6 +1,6 @@ package com.chinakingo.brvahktx -import android.support.v7.util.DiffUtil +import androidx.recyclerview.widget.DiffUtil import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.BaseViewHolder import com.chad.library.adapter.base.diff.BaseQuickDiffCallback