@@ -4,38 +4,94 @@ import android.graphics.Color
44import android.os.Bundle
55import android.view.View
66import android.view.ViewGroup
7+ import android.widget.ImageView
78import android.widget.TextView
89import android.widget.Toast
910import androidx.appcompat.app.AppCompatActivity
11+ import androidx.recyclerview.widget.DiffUtil
1012import androidx.recyclerview.widget.LinearLayoutManager
1113import androidx.recyclerview.widget.RecyclerView
14+ import com.blankj.utilcode.util.CloneUtils
15+ import com.blankj.utilcode.util.GsonUtils
16+ import com.bumptech.glide.Glide
17+ import com.bumptech.glide.load.engine.DiskCacheStrategy
18+ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
19+ import com.bumptech.glide.request.RequestOptions
20+ import com.google.gson.GsonBuilder
21+ import com.google.gson.reflect.TypeToken
1222import com.lxj.easyadapter.*
1323
1424import kotlinx.android.synthetic.main.activity_main.*
25+ import java.lang.reflect.Type
1526import java.util.*
1627import java.util.concurrent.CopyOnWriteArrayList
28+ import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
29+
30+
31+
1732
1833class MainActivity : AppCompatActivity () {
1934
2035 internal var userList: MutableList <User > = ArrayList ()
2136 private var adapter: EasyAdapter <User >? = null
2237 private var multiItemTypeAdapter: MultiItemTypeAdapter <User >? = null
23-
38+ val url = " https://img1.baidu.com/it/u=1925715390,133119052&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400 "
2439 override fun onCreate (savedInstanceState : Bundle ? ) {
2540 super .onCreate(savedInstanceState)
2641 setContentView(R .layout.activity_main)
42+ userList.add(User (name = " 盛大" ))
43+ userList.add(User (name = " 都是" ))
44+ userList.add(User (name = " CEAD" ))
45+ userList.add(User (name = " 大图" ))
46+ add.setOnClickListener {
47+ val old = deepCopy()
48+ val range = (0 until userList.size)
49+ userList.add(if (range.isEmpty()) 0 else range.random(), User (id = UUID .randomUUID().toString(), name = " 随机添加 - ${(0 .. 1000 ).random()} " ))
50+ DiffUtil .calculateDiff(UserDiffCallback (old, userList)).dispatchUpdatesTo(recyclerView.adapter!! )
51+ }
52+ del.setOnClickListener {
53+ if (userList.isNullOrEmpty()) return @setOnClickListener
54+ val range = (0 until userList.size)
55+ val old = deepCopy()
56+ userList.removeAt(range.random())
57+ DiffUtil .calculateDiff(UserDiffCallback (old, userList)).dispatchUpdatesTo(recyclerView.adapter!! )
58+ }
59+ update.setOnClickListener {
60+ if (userList.isNullOrEmpty()) return @setOnClickListener
61+ val index = (0 until userList.size).random()
62+ val old = deepCopy()
63+ userList[index].name + = " - 随机更新"
64+ DiffUtil .calculateDiff(UserDiffCallback (old, userList)).dispatchUpdatesTo(recyclerView.adapter!! )
65+ }
66+ replace.setOnClickListener {
67+ if (userList.isNullOrEmpty()) return @setOnClickListener
68+ val index = (0 until userList.size).random()
69+ val old = deepCopy()
70+ userList[index] = User (name = " 我是随机替换的" )
71+ DiffUtil .calculateDiff(UserDiffCallback (old, userList)).dispatchUpdatesTo(recyclerView.adapter!! )
72+ }
73+ move.setOnClickListener {
74+ if (userList.isNullOrEmpty()) return @setOnClickListener
75+ val old = deepCopy()
76+ userList.reverse()
77+ DiffUtil .calculateDiff(UserDiffCallback (old, userList)).dispatchUpdatesTo(recyclerView.adapter!! )
78+ }
2779 recyclerView.layoutManager = LinearLayoutManager (this )
28- recyclerView.itemAnimator = null
2980
3081 // prepare data
31- for (i in 0 .. 6 ) {
32- userList.add(User (" 本杰明 - $i " , i * 2 , i))
33- }
82+ // for (i in 0..6) {
83+ // userList.add(User("本杰明 - $i", i * 2, i))
84+ // }
3485
3586// testHeader()
3687 testMultiItem()
3788 }
3889
90+ fun deepCopy (): List <User >{
91+ val json = GsonBuilder ().create().toJson(userList)
92+ return GsonBuilder ().create().fromJson<List <User >>(json, object : TypeToken <List <User >>() {}.type)
93+ }
94+
3995 private fun testHeader () {
4096 adapter = object : EasyAdapter <User >(userList, R .layout.item) {
4197 override fun bind (holder : ViewHolder , user : User , position : Int ) {
@@ -88,10 +144,10 @@ class MainActivity : AppCompatActivity() {
88144 multiItemTypeAdapter = MultiItemTypeAdapter <User >(userList)
89145 .apply {
90146 addItemDelegate(OneDelegate ())
91- addItemDelegate(TwoDelegate ())
92- addHeaderView(createView(" Multi Header view1111" ))
93- addHeaderView(createView(" Multi Header view22222" ))
94- addFootView(createView(" Multi Footer view" ))
147+ // addItemDelegate(TwoDelegate())
148+ // addHeaderView(createView("Multi Header view1111"))
149+ // addHeaderView(createView("Multi Header view22222"))
150+ // addFootView(createView("Multi Footer view"))
95151 setOnItemClickListener(object : MultiItemTypeAdapter .OnItemClickListener {
96152 override fun onItemClick (view : View , holder : RecyclerView .ViewHolder , position : Int ) {
97153 Toast .makeText(this @MainActivity, " position: $position " , Toast .LENGTH_SHORT ).show()
@@ -108,13 +164,35 @@ class MainActivity : AppCompatActivity() {
108164 internal inner class OneDelegate : ItemDelegate <User > {
109165
110166 override fun isThisType (item : User , position : Int ): Boolean {
111- return position % 2 != 0
167+ return true
168+ // return position % 2 != 0
112169 }
113170 override fun bind (holder : ViewHolder , user : User , position : Int ) {
114- holder.setText(android.R .id.text1, " name: " + user.name + " - " + position)
171+ holder.setText(R .id.name, user.name)
172+ Glide .with (this @MainActivity)
173+ .load(url).transition(DrawableTransitionOptions .withCrossFade(1000 ))
174+ .diskCacheStrategy(DiskCacheStrategy .NONE )
175+ .skipMemoryCache(true )
176+ .placeholder(R .mipmap.ic_launcher_round)
177+ .into(holder.getView<ImageView >(R .id.avatar))
178+ }
179+
180+ // 布局更新
181+ override fun bindWithPayloads (
182+ holder : ViewHolder ,
183+ t : User ,
184+ position : Int ,
185+ payloads : List <Any >
186+ ) {
187+ if (payloads.isNullOrEmpty()) return
188+ val bundle = payloads[0 ] as Bundle
189+ val name = bundle.getString(" name" ) ? : " "
190+ if (! name.isNullOrEmpty()){
191+ holder.setText(R .id.name, name)
192+ }
115193 }
116194
117- override fun getLayoutId (): Int = android. R .layout.simple_list_item_1
195+ override fun getLayoutId (): Int = R .layout.adapter_one
118196 }
119197
120198 internal inner class TwoDelegate : ItemDelegate <User > {
0 commit comments