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_ diff --git a/README-cn.md b/README-cn.md index a7cd80ce5..633136a38 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%代码)** @@ -42,10 +42,10 @@ 然后在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) +## [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) @@ -272,6 +272,8 @@ public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter newData = getNewList(); + MyDiffCallback callback = new MyDiffCallback(newData, mAdapter.getData()); + 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) 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/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/DiffUtilActivity.java index 7e6ed1ed6..501113214 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.view.View; -import android.view.ViewGroup; import android.widget.Button; -import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; @@ -61,8 +59,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 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(); +// MyDiffCallback callback = new MyDiffCallback(newData, mAdapter.getData()); +// final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(callback, false); +// runOnUiThread(new Runnable() { +// @Override +// public void run() { +// mAdapter.setNewDiffData(diffResult, newData); +// } +// }); +// } +// }).start(); + } }); 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..85c6fad48 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/AnimationAdapter.java @@ -5,6 +5,8 @@ import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.data.DataServer; import com.chad.baserecyclerviewadapterhelper.entity.Status; @@ -29,7 +31,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 43de46c1a..3df0d00c6 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DataBindingUseAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.databinding.ViewDataBinding; import android.view.View; @@ -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..3673ecb1b 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/ExpandableItemAdapter.java @@ -3,6 +3,8 @@ import android.util.Log; import android.view.View; +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.Level0Item; import com.chad.baserecyclerviewadapterhelper.entity.Level1Item; @@ -39,7 +41,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..a1d386d26 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,8 @@ package com.chad.baserecyclerviewadapterhelper.adapter; + +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.data.DataServer; import com.chad.baserecyclerviewadapterhelper.entity.Status; @@ -16,7 +19,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..bced9ed09 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,8 @@ package com.chad.baserecyclerviewadapterhelper.adapter; + +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.HomeItem; import com.chad.library.adapter.base.BaseQuickAdapter; @@ -16,7 +19,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 f28b096b3..33cc9663b 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 androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.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..a0c96889c 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,6 @@ package com.chad.baserecyclerviewadapterhelper.adapter; +import androidx.annotation.NonNull; import com.chad.baserecyclerviewadapterhelper.R; import com.chad.library.adapter.base.BaseItemDraggableAdapter; import com.chad.library.adapter.base.BaseViewHolder; @@ -15,7 +16,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..eab913b99 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/MultipleItemQuickAdapter.java @@ -1,7 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter; import android.content.Context; - +import androidx.annotation.NonNull; import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.MultipleItem; import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; @@ -23,7 +23,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..eb4cd4067 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/NestAdapter.java @@ -6,6 +6,8 @@ import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.data.DataServer; import com.chad.baserecyclerviewadapterhelper.entity.Status; @@ -29,7 +31,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..cf43ca1fa 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java @@ -6,6 +6,8 @@ import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.entity.Status; import com.chad.baserecyclerviewadapterhelper.util.SpannableStringUtils; @@ -28,7 +30,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..d29b92309 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 androidx.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..98027388d 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 androidx.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..f4b927f0c 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 androidx.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 90798b36a..cd039ee8e 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 @@ -23,7 +23,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 0a04e7155..8962fa01a 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/base/BaseDataBindingAdapter.java @@ -1,5 +1,6 @@ package com.chad.baserecyclerviewadapterhelper.base; +import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.databinding.ViewDataBinding; import androidx.annotation.LayoutRes; @@ -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/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..88222e5d5 --- /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 14 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + consumerProguardFiles 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + 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/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..dd4b11abf --- /dev/null +++ b/brvahKtx/src/main/java/com/chinakingo/brvahktx/AdapterKtx.kt @@ -0,0 +1,29 @@ +package com.chinakingo.brvahktx + +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 +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/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/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 8e23fd398..16b9fa51f 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..d150fb548 100644 --- a/library/proguard-rules.pro +++ b/library/proguard-rules.pro @@ -15,3 +15,12 @@ #-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 class **$** extends com.chad.library.adapter.base.BaseViewHolder { + (...); +} +-keepattributes InnerClasses \ No newline at end of file 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 3609ccb68..279273f75 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/BaseMultiItemQuickAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseMultiItemQuickAdapter.java index 3bf29e253..7fb244de1 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 androidx.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); + } } } 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 0f7dc9711..64455eb38 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 @@ -516,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 @@ -533,6 +534,26 @@ public void setNewDiffData(@NonNull BaseQuickDiffCallback baseQuickDiffCallba mData = baseQuickDiffCallback.getNewList(); } + /** + * 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 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(newData); + return; + } + diffResult.dispatchUpdatesTo(new BaseQuickAdapterListUpdateCallback(BaseQuickAdapter.this)); + mData = newData; + } + /** * insert a item associated with the specified position of adapter * @@ -861,7 +882,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) { @@ -888,7 +909,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) { @@ -959,7 +980,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 @@ -1883,34 +1904,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(); } /** 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 f96fc8a29..36b6bba4a 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,8 @@ import androidx.annotation.IntRange; import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; + import android.util.SparseIntArray; import android.view.ViewGroup; @@ -86,7 +88,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..0abf31131 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 @@ -2,6 +2,8 @@ import android.view.ViewGroup; +import androidx.annotation.NonNull; + import com.chad.library.adapter.base.entity.SectionEntity; import java.util.List; @@ -47,7 +49,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 0df4a1187..f77e1dadb 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,9 +1,11 @@ package com.chad.library.adapter.base; -import androidx.annotation.Nullable; import android.util.SparseArray; import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.chad.library.adapter.base.provider.BaseItemProvider; import com.chad.library.adapter.base.util.MultiTypeDelegate; import com.chad.library.adapter.base.util.ProviderDelegate; @@ -60,7 +62,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); 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'