diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 856204d..3cd3787 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -40,10 +40,7 @@ jobs:
build:
name: Build
- strategy:
- matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 0d15693..8c4e9b2 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -3,20 +3,12 @@
-
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 5e8c53d..55c2d20 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,6 +1,7 @@
plugins {
id("com.android.application")
id("kotlin-android")
+ id("kotlin-parcelize")
}
android {
diff --git a/app/src/main/java/com/kronos/sample/entity/TestEntity.kt b/app/src/main/java/com/kronos/sample/entity/TestEntity.kt
index 0f6a769..549853f 100644
--- a/app/src/main/java/com/kronos/sample/entity/TestEntity.kt
+++ b/app/src/main/java/com/kronos/sample/entity/TestEntity.kt
@@ -1,16 +1,17 @@
package com.kronos.sample.entity
-import android.os.Parcel
import android.os.Parcelable
-
import com.kronos.diffutil.IDifference
import com.kronos.diffutil.IEqualsAdapter
-
+import kotlinx.parcelize.Parcelize
import java.util.Random
-data class TestEntity(var id: Int = 0,
- var displayTime: Long = 0,
- var text: String? = Random().nextInt(10000).toString()) : Parcelable, IDifference, IEqualsAdapter {
+@Parcelize
+data class TestEntity(
+ var id: Int = 0,
+ var displayTime: Long = 0,
+ var text: String? = Random().nextInt(10000).toString()
+) : Parcelable, IDifference, IEqualsAdapter {
override val uniqueId: String
get() = id.toString()
@@ -19,27 +20,4 @@ data class TestEntity(var id: Int = 0,
displayTime = System.currentTimeMillis()
text = "更新数据"
}
-
-
- constructor(source: Parcel) : this(
- source.readInt(),
- source.readLong(),
- source.readString()
- )
-
- override fun describeContents() = 0
-
- override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
- writeInt(id)
- writeLong(displayTime)
- writeString(text)
- }
-
- companion object {
- @JvmField
- val CREATOR: Parcelable.Creator = object : Parcelable.Creator {
- override fun createFromParcel(source: Parcel): TestEntity = TestEntity(source)
- override fun newArray(size: Int): Array = arrayOfNulls(size)
- }
- }
}
\ No newline at end of file
diff --git a/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt b/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt
index d861b06..4363865 100644
--- a/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt
+++ b/diflib/src/main/java/com/kronos/diffutil/ParcelDiffHelper.kt
@@ -8,24 +8,25 @@ import java.util.concurrent.CopyOnWriteArrayList
class ParcelDiffHelper : BaseDiffHelper() {
override fun clone() {
- try {
- itemsCursor?.apply {
- snapshot = CopyOnWriteArrayList()
- for (entity in this) {
- val parcel = Parcel.obtain()
- (entity as Parcelable).writeToParcel(parcel, 0)
- parcel.setDataPosition(0)
- val constructor = entity.javaClass.getDeclaredConstructor(Parcel::class.java)
- constructor.isAccessible = true
- val dateEntity = constructor.newInstance(parcel) as T
- snapshot?.add(dateEntity)
- parcel.recycle()
- }
+ itemsCursor?.run {
+ snapshot = CopyOnWriteArrayList()
+ forEach {
+ snapshot?.add(it.deepCopy() ?: it)
}
- } catch (e: Exception) {
- e.printStackTrace()
}
}
+ private fun T.deepCopy(): T? {
+ var parcel: Parcel? = null
+ return try {
+ parcel = Parcel.obtain().also {
+ it.writeParcelable(this, 0)
+ it.setDataPosition(0)
+ }
+ parcel.readParcelable(this::class.java.classLoader)
+ } finally {
+ parcel?.recycle()
+ }
+ }
}