Skip to content

Commit e2fa071

Browse files
perf(*): 优化EditableImageAdapter、ReadOnlyImageAdapter、ViewHolder
1 parent 88ded06 commit e2fa071

File tree

13 files changed

+268
-253
lines changed

13 files changed

+268
-253
lines changed

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Android依赖库,Android-library升级Kotlin版。
1414
```gradle
1515
dependencies {
1616
//基础依赖库
17-
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4'
17+
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:latest.integration'
1818
}
1919
```
2020

@@ -52,7 +52,6 @@ val selectCustomerAdapter = object :
5252
viewHolder.setText(R.id.xxxx, item.xxxxx)
5353
}
5454
}
55-
(customerRecyclerView.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
5655
customerRecyclerView.adapter = selectCustomerAdapter
5756
```
5857

@@ -69,7 +68,6 @@ val selectSampleAdapter = object :
6968
viewHolder.setText(R.id.xxxx, item.xxxxx)
7069
}
7170
}
72-
(sampleRecyclerView.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
7371
sampleRecyclerView.adapter = selectSampleAdapter
7472
```
7573

app/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ dependencies {
3232
implementation 'androidx.core:core-ktx:1.9.0'
3333
implementation 'androidx.appcompat:appcompat:1.6.1'
3434
implementation 'androidx.recyclerview:recyclerview:1.2.1'
35+
//Google官方授权库
36+
implementation 'pub.devrel:easypermissions:3.0.0'
3537
implementation 'com.google.code.gson:gson:2.9.0'
3638
//沉浸式状态栏。基础依赖包,必须要依赖
3739
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
40+
//图片选择框架
41+
implementation 'io.github.lucksiege:pictureselector:v3.0.4'
42+
//图片加载库
43+
implementation 'com.github.bumptech.glide:glide:4.9.0'
3844
}

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.pengxh.kt.lib">
44

5-
<!-- 一般通用权限 -->
6-
<uses-permission android:name="android.permission.BLUETOOTH" />
7-
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
5+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
6+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
87

98
<application
109
android:allowBackup="true"
@@ -15,13 +14,15 @@
1514
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
1615
android:usesCleartextTraffic="true">
1716
<activity
18-
android:name=".MainActivity"
17+
android:name=".WelcomeActivity"
1918
android:exported="true">
2019
<intent-filter>
2120
<action android:name="android.intent.action.MAIN" />
2221

2322
<category android:name="android.intent.category.LAUNCHER" />
2423
</intent-filter>
2524
</activity>
25+
26+
<activity android:name=".MainActivity" />
2627
</application>
2728
</manifest>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.pengxh.kt.lib
2+
3+
import android.content.Context
4+
import android.graphics.Bitmap
5+
import android.graphics.drawable.Drawable
6+
import android.widget.ImageView
7+
import androidx.annotation.Nullable
8+
import com.bumptech.glide.Glide
9+
import com.bumptech.glide.load.resource.bitmap.CenterCrop
10+
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
11+
import com.bumptech.glide.request.RequestOptions
12+
import com.bumptech.glide.request.target.CustomTarget
13+
import com.bumptech.glide.request.transition.Transition
14+
import com.luck.picture.lib.engine.ImageEngine
15+
import com.luck.picture.lib.interfaces.OnCallbackListener
16+
import com.luck.picture.lib.utils.ActivityCompatHelper
17+
18+
class GlideLoadEngine private constructor() : ImageEngine {
19+
companion object {
20+
val get: GlideLoadEngine by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
21+
GlideLoadEngine()
22+
}
23+
}
24+
25+
override fun loadImage(context: Context, url: String, imageView: ImageView) {
26+
if (!ActivityCompatHelper.assertValidRequest(context)) {
27+
return
28+
}
29+
Glide.with(context).load(url).into(imageView);
30+
}
31+
32+
override fun loadImageBitmap(
33+
context: Context,
34+
url: String,
35+
maxWidth: Int,
36+
maxHeight: Int,
37+
call: OnCallbackListener<Bitmap>?
38+
) {
39+
if (!ActivityCompatHelper.assertValidRequest(context)) {
40+
return
41+
}
42+
Glide.with(context)
43+
.asBitmap()
44+
.override(maxWidth, maxHeight)
45+
.load(url)
46+
.into(object : CustomTarget<Bitmap?>() {
47+
override fun onResourceReady(
48+
resource: Bitmap, @Nullable transition: Transition<in Bitmap?>?
49+
) {
50+
call?.onCall(resource)
51+
}
52+
53+
override fun onLoadFailed(@Nullable errorDrawable: Drawable?) {
54+
call?.onCall(null)
55+
}
56+
57+
override fun onLoadCleared(@Nullable placeholder: Drawable?) {}
58+
})
59+
}
60+
61+
override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) {
62+
if (!ActivityCompatHelper.assertValidRequest(context)) {
63+
return
64+
}
65+
Glide.with(context)
66+
.asBitmap()
67+
.load(url)
68+
.override(180, 180)
69+
.sizeMultiplier(0.5f)
70+
.transform(CenterCrop(), RoundedCorners(8))
71+
.placeholder(R.mipmap.load_image_error)
72+
.into(imageView)
73+
}
74+
75+
override fun pauseRequests(context: Context?) {
76+
context?.let { Glide.with(it).pauseRequests() }
77+
}
78+
79+
override fun resumeRequests(context: Context?) {
80+
context?.let { Glide.with(it).resumeRequests() }
81+
}
82+
83+
override fun loadGridImage(context: Context, url: String, imageView: ImageView) {
84+
Glide.with(context)
85+
.load(url)
86+
.apply(RequestOptions().placeholder(R.mipmap.load_image_error))
87+
.into(imageView)
88+
}
89+
}
Lines changed: 45 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,138 +1,76 @@
11
package com.pengxh.kt.lib
22

3-
import android.graphics.Color
4-
import android.os.Handler
5-
import android.util.Log
6-
import android.widget.TextView
7-
import com.google.gson.Gson
8-
import com.google.gson.reflect.TypeToken
3+
import android.view.View
4+
import com.luck.picture.lib.basic.PictureSelector
5+
import com.luck.picture.lib.config.SelectMimeType
6+
import com.luck.picture.lib.entity.LocalMedia
7+
import com.luck.picture.lib.interfaces.OnResultCallbackListener
8+
import com.pengxh.kt.lite.adapter.EditableImageAdapter
99
import com.pengxh.kt.lite.base.KotlinBaseActivity
10-
import com.pengxh.kt.lite.extensions.*
11-
import com.pengxh.kt.lite.utils.WeakReferenceHandler
1210
import kotlinx.android.synthetic.main.activity_main.*
13-
import java.text.SimpleDateFormat
14-
import java.util.*
15-
import kotlin.math.abs
16-
1711

1812
class MainActivity : KotlinBaseActivity() {
1913

20-
companion object {
21-
lateinit var timer: Timer
22-
}
23-
2414
private val kTag = "MainActivity"
25-
private lateinit var weakReferenceHandler: WeakReferenceHandler
26-
private var noticeBeans: MutableList<NoticeListModel.DataModel.RowsModel> = ArrayList()
27-
private var currentIndex = 0
15+
private val images = listOf(
16+
"https://images.pexels.com/photos/1036808/pexels-photo-1036808.jpeg",
17+
"https://images.pexels.com/photos/796602/pexels-photo-796602.jpeg",
18+
"https://images.pexels.com/photos/1109543/pexels-photo-1109543.jpeg",
19+
"https://images.pexels.com/photos/296115/pexels-photo-296115.jpeg",
20+
"https://images.pexels.com/photos/296115/pexels-photo-296115.jpeg",
21+
"https://images.pexels.com/photos/296115/pexels-photo-296115.jpeg",
22+
"https://images.pexels.com/photos/296115/pexels-photo-296115.jpeg",
23+
"https://images.pexels.com/photos/296115/pexels-photo-296115.jpeg",
24+
"https://images.pexels.com/photos/4158/apple-iphone-smartphone-desk.jpg"
25+
)
26+
private val recyclerViewImages = ArrayList<String>()
2827

2928
override fun initLayoutView(): Int = R.layout.activity_main
3029

3130
override fun setupTopBarLayout() {
32-
val screenWidth = getScreenWidth()
33-
34-
val screenHeight = getScreenHeight()
35-
36-
val statusBarHeight = getStatusBarHeight()
3731

38-
val screenDensity = getScreenDensity()
39-
40-
Log.d(
41-
kTag,
42-
"setupTopBarLayout => [${screenWidth},${screenHeight},${statusBarHeight},${screenDensity}]"
43-
)
4432
}
4533

4634
override fun observeRequestState() {
4735

4836
}
4937

5038
override fun initData() {
51-
val response = readAssetsFile("Test.json")
52-
val it = Gson().fromJson<NoticeListModel>(
53-
response, object : TypeToken<NoticeListModel>() {}.type
54-
)
55-
noticeBeans = it.data.rows
56-
57-
noticeSwitcherView.setFactory {
58-
val textView = TextView(this)
59-
textView.setTextColor(Color.BLACK)
60-
textView
61-
}
62-
noticeSwitcherView.setAnimation()
63-
64-
timeSwitcherView.setFactory {
65-
val textView = TextView(this)
66-
textView.setTextColor(R.color.hintColor.convertColor(this))
67-
textView
68-
}
69-
timeSwitcherView.setAnimation()
70-
71-
weakReferenceHandler = WeakReferenceHandler(callback)
72-
//消息滚动Timer
73-
timer = Timer()
74-
timer.schedule(object : TimerTask() {
75-
override fun run() {
76-
weakReferenceHandler.sendEmptyMessage(2023030601)
39+
val imageAdapter = EditableImageAdapter(this, 9, 2f)
40+
imageGridView.adapter = imageAdapter
41+
imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
42+
override fun onAddImageClick() {
43+
PictureSelector.create(this@MainActivity)
44+
.openGallery(SelectMimeType.ofImage())
45+
.isGif(false)
46+
.isMaxSelectEnabledMask(true)
47+
.setFilterMinFileSize(100)
48+
.setMaxSelectNum(9)
49+
.isDisplayCamera(false)
50+
.setImageEngine(GlideLoadEngine.get)
51+
.forResult(object : OnResultCallbackListener<LocalMedia> {
52+
override fun onResult(result: ArrayList<LocalMedia>) {
53+
result.forEach {
54+
recyclerViewImages.add(it.realPath)
55+
}
56+
imageAdapter.setupImage(recyclerViewImages)
57+
}
58+
59+
override fun onCancel() {}
60+
})
7761
}
78-
}, 0, 3000)
79-
}
8062

81-
private val callback = Handler.Callback { msg ->
82-
when (msg.what) {
83-
2023030601 -> {
84-
if (noticeBeans.size != 0) {
85-
val model = noticeBeans[currentIndex % noticeBeans.size]
63+
override fun onItemClick(position: Int) {
8664

87-
noticeSwitcherView.setText(model.noticeTitle)
65+
}
8866

89-
val deltaT = model.createTime.diffCurrentTime()
90-
val diffTime = if (deltaT < 24) {
91-
"${deltaT}小时前"
92-
} else {
93-
model.createTime.formatToDate()
94-
}
95-
timeSwitcherView.setText(diffTime)
96-
currentIndex++
97-
} else {
98-
noticeSwitcherView.setText("暂无新消息")
99-
timeSwitcherView.setText("--:--")
100-
}
67+
override fun onItemLongClick(view: View?, position: Int) {
68+
imageAdapter.deleteImage(position)
10169
}
102-
}
103-
true
70+
})
10471
}
10572

10673
override fun initEvent() {
10774

10875
}
109-
110-
override fun onDestroy() {
111-
super.onDestroy()
112-
timer.cancel()
113-
}
114-
115-
/**
116-
* 时间差-小时
117-
* */
118-
private fun String.diffCurrentTime(): Int {
119-
if (this.isBlank()) {
120-
return 0
121-
}
122-
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
123-
val date = simpleDateFormat.parse(this)
124-
val diff = abs(System.currentTimeMillis() - date.time)
125-
return (diff / (3600000)).toInt()
126-
}
127-
128-
private fun String.formatToDate(): String {
129-
if (this.isBlank()) {
130-
return this
131-
}
132-
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
133-
val date = simpleDateFormat.parse(this)
134-
135-
val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA)
136-
return dateFormat.format(date)
137-
}
13876
}

app/src/main/java/com/pengxh/kt/lib/NoticeListModel.kt

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)