diff --git a/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapter.kt b/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapter.kt index 6b1b8ff..976c2b4 100644 --- a/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapter.kt +++ b/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapter.kt @@ -55,25 +55,6 @@ open class DslAdapter(dataItems: List? = null) : /**数据过滤规则*/ var dslDataFilter: DslDataFilter? = null - set(value) { - if (field == value) { - return - } - //remove - field?.apply { - removeDispatchUpdatesListener(this@DslAdapter) - beforeFilterInterceptorList.remove(adapterStatusIFilterInterceptor) - afterFilterInterceptorList.remove(loadMoreIFilterInterceptor) - } - field = value - //add - field?.apply { - addDispatchUpdatesListener(this@DslAdapter) - beforeFilterInterceptorList.add(0, adapterStatusIFilterInterceptor) - afterFilterInterceptorList.add(loadMoreIFilterInterceptor) - } - updateItemDepend() - } /**单/多选助手*/ val itemSelectorHelper = ItemSelectorHelper(this) @@ -107,8 +88,7 @@ open class DslAdapter(dataItems: List? = null) : val _itemLayoutHold = hashMapOf() init { - dslDataFilter = DslDataFilter(this) - + updateDataFilter(DslDataFilter(this)) dataItems?.let { this.dataItems.clear() this.dataItems.addAll(dataItems) @@ -279,6 +259,26 @@ open class DslAdapter(dataItems: List? = null) : itemUpdateDependObserver.remove(action) } + /**更新数据过滤器[DslDataFilter]*/ + fun updateDataFilter(dataFilter: DslDataFilter?) { + if (dslDataFilter == dataFilter) { + return + } + //remove + dslDataFilter?.apply { + removeDispatchUpdatesListener(this@DslAdapter) + beforeFilterInterceptorList.remove(adapterStatusIFilterInterceptor) + afterFilterInterceptorList.remove(loadMoreIFilterInterceptor) + } + dslDataFilter = dataFilter + //add + dslDataFilter?.apply { + addDispatchUpdatesListener(this@DslAdapter) + beforeFilterInterceptorList.add(0, adapterStatusIFilterInterceptor) + afterFilterInterceptorList.add(loadMoreIFilterInterceptor) + } + } + // // @@ -320,10 +320,13 @@ open class DslAdapter(dataItems: List? = null) : * [DslAdapterStatusItem.ADAPTER_STATUS_ERROR] * */ @UpdateFlag - fun setAdapterStatus(status: Int) { + fun setAdapterStatus(status: Int, error: Throwable? = null) { if (dslAdapterStatusItem.itemState == status) { return } + if (status == DslAdapterStatusItem.ADAPTER_STATUS_ERROR) { + dslAdapterStatusItem.itemErrorThrowable = error + } dslAdapterStatusItem.itemState = status dslAdapterStatusItem.itemUpdateFlag = true } @@ -448,7 +451,7 @@ open class DslAdapter(dataItems: List? = null) : /**插入数据列表*/ @UpdateFlag - fun insertItem(index: Int, item: DslAdapterItem, checkExist: Boolean = false) { + fun insertItem(index: Int, item: DslAdapterItem, checkExist: Boolean = true) { if (checkExist && dataItems.contains(item)) { return } @@ -576,13 +579,13 @@ open class DslAdapter(dataItems: List? = null) : @UpdateFlag fun removeItemFrom( - list: MutableList, + fromList: MutableList, item: DslAdapterItem, updateOther: Boolean ) { val index = adapterItems.indexOf(item) if (index != -1) { - if (list.remove(item)) { + if (fromList.remove(item)) { item.itemRemoveFlag = true if (updateOther) { for (i in (index + 1) until adapterItems.size) { @@ -722,6 +725,17 @@ open class DslAdapter(dataItems: List? = null) : // + /** 获取[fromItem]更新时, 有多少子项需要更新 */ + fun getUpdateDependItemListFrom(fromItem: DslAdapterItem): List { + val notifyChildFormItemList = mutableListOf() + getValidFilterDataList().forEachIndexed { index, dslAdapterItem -> + if (fromItem.isItemInUpdateList(dslAdapterItem, index)) { + notifyChildFormItemList.add(dslAdapterItem) + } + } + return notifyChildFormItemList + } + /**获取有效过滤后的数据集合*/ fun getValidFilterDataList(): List { return dslDataFilter?.filterDataList ?: adapterItems @@ -858,6 +872,16 @@ open class DslAdapter(dataItems: List? = null) : addLastItem(this, config) } + /** + * ``` + * DslDemoItem()(0){} + * ``` + * */ + @UpdateFlag + operator fun T.invoke(index: Int, config: T.() -> Unit = {}) { + insertItem(index, this, config) + } + @UpdateFlag operator fun T.invoke( list: MutableList, @@ -866,6 +890,15 @@ open class DslAdapter(dataItems: List? = null) : addLastItem(list, this, config) } + @UpdateFlag + operator fun T.invoke( + index: Int, + list: MutableList, + config: T.() -> Unit = {} + ) { + insertItem(list, index, this, config) + } + /** *
      * this + DslAdapterItem()
diff --git a/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapterItem.kt b/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapterItem.kt
index 0a3387d..1124bf4 100644
--- a/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapterItem.kt
+++ b/Adapter/src/main/java/com/angcyo/dsladapter/DslAdapterItem.kt
@@ -11,6 +11,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.annotation.AnimRes
 import androidx.annotation.AnimatorRes
+import androidx.annotation.AnyThread
 import androidx.annotation.CallSuper
 import androidx.core.math.MathUtils.clamp
 import androidx.lifecycle.Lifecycle
@@ -19,6 +20,8 @@ import androidx.lifecycle.LifecycleRegistry
 import androidx.recyclerview.widget.*
 import com.angcyo.dsladapter.SwipeMenuHelper.Companion.SWIPE_MENU_TYPE_DEFAULT
 import com.angcyo.dsladapter.SwipeMenuHelper.Companion.SWIPE_MENU_TYPE_FLOWING
+import com.angcyo.dsladapter.annotation.UpdateByDiff
+import com.angcyo.dsladapter.annotation.UpdateFlag
 import com.angcyo.dsladapter.internal.ThrottleClickListener
 import java.lang.ref.WeakReference
 import kotlin.properties.ReadWriteProperty
@@ -81,8 +84,9 @@ open class DslAdapterItem : LifecycleOwner {
     //
 
     /**[com.angcyo.dsladapter.DslAdapter.notifyItemChanged]*/
+    @AnyThread
     open fun updateAdapterItem(payload: Any? = PAYLOAD_UPDATE_PART, useFilterList: Boolean = true) {
-        if (itemDslAdapter?._recyclerView?.isComputingLayout == true) {
+        if (itemDslAdapter?._recyclerView?.isComputingLayout == true || !isMain()) {
             //L.w("跳过操作! [RecyclerView]正在计算布局, 请不要在RecyclerView正在布局时, 更新Item. ")
             itemDslAdapter?._recyclerView?.post {
                 updateAdapterItem(payload, useFilterList)
@@ -95,6 +99,7 @@ open class DslAdapterItem : LifecycleOwner {
     }
 
     /**移除[item]*/
+    @UpdateFlag
     open fun removeAdapterItem() {
         itemDslAdapter?.apply {
             removeItemFromAll(this@DslAdapterItem)
@@ -104,6 +109,7 @@ open class DslAdapterItem : LifecycleOwner {
     }
 
     /**负载更新, 通常用于更新媒体item*/
+    @UpdateByDiff
     open fun updateItemDependPayload(payload: Any? = mediaPayload()) {
         updateItemDepend(
             FilterParams(
@@ -121,6 +127,7 @@ open class DslAdapterItem : LifecycleOwner {
      * [isItemInUpdateList]
      * [itemUpdateFrom]
      * */
+    @UpdateByDiff
     open fun updateItemDepend(
         filterParams: FilterParams = FilterParams(
             fromDslAdapterItem = this,
@@ -151,6 +158,7 @@ open class DslAdapterItem : LifecycleOwner {
     /**有依赖时, 才更新
      * [updateItemDepend]*/
     open fun updateItemOnHaveDepend(
+        updateSelf: Boolean = true,
         filterParams: FilterParams = FilterParams(
             fromDslAdapterItem = this,
             updateDependItemWithEmpty = false,
@@ -158,15 +166,13 @@ open class DslAdapterItem : LifecycleOwner {
         )
     ) {
         val notifyChildFormItemList = mutableListOf()
-        itemDslAdapter?.getValidFilterDataList()?.forEachIndexed { index, dslAdapterItem ->
-            if (isItemInUpdateList(dslAdapterItem, index)) {
-                return@forEachIndexed
-            }
+        itemDslAdapter?.getUpdateDependItemListFrom(this)?.let {
+            notifyChildFormItemList.addAll(it)
         }
 
         if (notifyChildFormItemList.isNotEmpty()) {
             updateItemDepend(filterParams)
-        } else {
+        } else if (updateSelf) {
             //否则更新自己
             updateAdapterItem(filterParams.payload)
         }
@@ -244,6 +250,9 @@ open class DslAdapterItem : LifecycleOwner {
     /**唯一标识此item的值*/
     var itemTag: String? = null
 
+    /**异常标识, 自定义数据*/
+    var itemThrowable: Throwable? = null
+
     /**item存储数据使用*/
     var itemTags: SparseArray? = null
 
@@ -330,7 +339,7 @@ open class DslAdapterItem : LifecycleOwner {
             _itemAnimateDelay =
                 itemDslAdapter?.adapterItemAnimateDelayHandler?.computeAnimateDelay(this)
                     ?: _itemAnimateDelay
-            L.w("_itemAnimateDelay:$_itemAnimateDelay")
+            //L.w("_itemAnimateDelay:$_itemAnimateDelay")
             if (_itemAnimateDelay >= 0) {
                 val animation = animationOf(itemHolder.context, itemAnimateRes)
                 if (animation != null) {
@@ -1139,7 +1148,8 @@ open class DslAdapterItem : LifecycleOwner {
 
     /**其次, 提供一个可以被子类覆盖的方法*/
     open fun onItemChangeListener(item: DslAdapterItem) {
-        updateItemDepend()
+        //有依赖的item需要更新时, 再刷新界面
+        updateItemOnHaveDepend()
     }
 
     /**[itemChangeListener]*/
@@ -1207,8 +1217,11 @@ open class DslAdapterItem : LifecycleOwner {
     /**是否选中, 需要 [ItemSelectorHelper.selectorModel] 的支持. */
     var itemIsSelected = false
         set(value) {
+            val old = field
             field = value
-            onSetItemSelected(value)
+            if (old != value) {
+                onSetItemSelected(value)
+            }
         }
 
     /**简单的互斥操作支持
@@ -1235,7 +1248,7 @@ open class DslAdapterItem : LifecycleOwner {
     /**监听item select改变事件*/
     var onItemSelectorChange: ItemSelectAction = {
         if (it.updateItemDepend) {
-            updateItemDepend()
+            updateItemOnHaveDepend()
         }
     }
 
@@ -1462,6 +1475,9 @@ open class DslAdapterItem : LifecycleOwner {
         if (lifecycleRegistry.currentState.isAtLeast(Lifecycle.State.CREATED)) {
             lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
         }
+        if (itemAnimateRes != 0) {
+            itemHolder.itemView.clearAnimation()
+        }
         itemHolder.clear()
     }