Skip to content

Commit 15224df

Browse files
author
wangpeng
committed
fix 快速双击返回 crash
1 parent 1446efe commit 15224df

7 files changed

Lines changed: 44 additions & 32 deletions

File tree

.gitignore

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
*.iml
22
.gradle
3-
/local.properties
4-
/.idea/caches/build_file_checksums.ser
5-
/.idea/libraries
6-
/.idea/modules.xml
7-
/.idea/workspace.xml
3+
local.properties
4+
.idea/caches/build_file_checksums.ser
5+
.idea/libraries
6+
.idea/modules.xml
7+
.idea/workspace.xml
88
.DS_Store
99
/build
1010
/captures

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#### 使用
1313
```
14-
implementation 'com.github.iielse:imageviewer:2.0.7'
14+
implementation 'com.github.iielse:imageviewer:2.0.8'
1515
```
1616
```
1717
val builder = ImageViewerBuilder(

imageviewer/src/main/java/com/github/iielse/imageviewer/ImageViewerDialogFragment.kt

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.os.Bundle
55
import android.view.LayoutInflater
66
import android.view.View
77
import android.view.ViewGroup
8-
import android.widget.ImageView
98
import androidx.lifecycle.Observer
109
import androidx.lifecycle.ViewModelProvider
1110
import androidx.recyclerview.widget.RecyclerView
@@ -29,6 +28,11 @@ class ImageViewerDialogFragment : BaseDialogFragment() {
2928
private val transformer by lazy { requireTransformer() }
3029
private val adapter by lazy { ImageViewerAdapter(initKey) }
3130

31+
override fun onCreate(savedInstanceState: Bundle?) {
32+
super.onCreate(savedInstanceState)
33+
if (!Components.working) dismissAllowingStateLoss()
34+
}
35+
3236
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3337
return inflater.inflate(R.layout.fragment_image_viewer_dialog, container, false)
3438
}
@@ -82,7 +86,9 @@ class ImageViewerDialogFragment : BaseDialogFragment() {
8286

8387
override fun onRelease(viewHolder: RecyclerView.ViewHolder, view: View) {
8488
val startView = (view.getTag(R.id.viewer_adapter_item_key) as? Long?)?.let { transformer.getView(it) }
85-
release(startView, viewHolder, view)
89+
TransitionEndHelper.end(this@ImageViewerDialogFragment, startView, viewHolder)
90+
background.changeToBackgroundColor(Color.TRANSPARENT)
91+
userCallback.onRelease(viewHolder, view)
8692
}
8793
}
8894
}
@@ -107,22 +113,22 @@ class ImageViewerDialogFragment : BaseDialogFragment() {
107113
super.onDestroyView()
108114
adapter.setListener(null)
109115
viewer.unregisterOnPageChangeCallback(pagerCallback)
116+
Components.release()
110117
}
111118

112119
override fun onBackPressed() {
120+
if (TransitionStartHelper.animating || TransitionEndHelper.animating) return
113121
log { "onBackPressed ${viewer.currentItem}" }
122+
114123
val currentKey = adapter.getItemId(viewer.currentItem)
115-
val startView = transformer.getView(currentKey)
116-
val endView = viewer.findViewWithKeyTag(R.id.viewer_adapter_item_key, currentKey)
117-
val viewHolder = endView?.getTag(R.id.viewer_adapter_item_holder) as? RecyclerView.ViewHolder?
118-
release(startView, viewHolder, endView)
119-
}
124+
viewer.findViewWithKeyTag(R.id.viewer_adapter_item_key, currentKey)?.let { endView ->
125+
val startView = transformer.getView(currentKey)
126+
background.changeToBackgroundColor(Color.TRANSPARENT)
120127

121-
private fun release(startView: ImageView?, viewHolder: RecyclerView.ViewHolder?, endView: View?) {
122-
if (viewHolder == null || endView == null) return
123-
TransitionEndHelper.end(this, startView, viewHolder)
124-
background.changeToBackgroundColor(Color.TRANSPARENT)
125-
userCallback.onRelease(viewHolder, endView)
126-
Components.release()
128+
(endView.getTag(R.id.viewer_adapter_item_holder) as? RecyclerView.ViewHolder?)?.let {
129+
TransitionEndHelper.end(this, startView, it)
130+
userCallback.onRelease(it, endView)
131+
}
132+
}
127133
}
128134
}

imageviewer/src/main/java/com/github/iielse/imageviewer/adapter/ImageViewerAdapter.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import androidx.paging.PagedListAdapter
66
import androidx.recyclerview.widget.DiffUtil
77
import androidx.recyclerview.widget.RecyclerView
88
import androidx.recyclerview.widget.RecyclerView.NO_ID
9-
import com.github.iielse.imageviewer.*
9+
import com.github.iielse.imageviewer.ImageViewerAdapterListener
10+
import com.github.iielse.imageviewer.R
1011
import com.github.iielse.imageviewer.core.Photo
1112
import com.github.iielse.imageviewer.utils.inflate
1213
import com.github.iielse.imageviewer.utils.log
13-
import com.github.iielse.imageviewer.viewholders.UnknownViewHolder
1414
import com.github.iielse.imageviewer.viewholders.PhotoViewHolder
1515
import com.github.iielse.imageviewer.viewholders.SubsamplingViewHolder
16+
import com.github.iielse.imageviewer.viewholders.UnknownViewHolder
1617
import java.util.*
1718

1819
class ImageViewerAdapter(initKey: Long) : PagedListAdapter<Item, RecyclerView.ViewHolder>(diff) {
@@ -45,8 +46,8 @@ class ImageViewerAdapter(initKey: Long) : PagedListAdapter<Item, RecyclerView.Vi
4546
}
4647
}
4748

48-
override fun getItemId(position: Int): Long = getItem(position)?.id ?: NO_ID
49-
override fun getItemViewType(position: Int) = getItem(position)?.type ?: ItemType.UNKNOWN
49+
override fun getItemId(position: Int): Long = provideItem(position)?.id ?: NO_ID
50+
override fun getItemViewType(position: Int) = provideItem(position)?.type ?: ItemType.UNKNOWN
5051
private val callback: ImageViewerAdapterListener = object : ImageViewerAdapterListener {
5152
override fun onInit(viewHolder: RecyclerView.ViewHolder) {
5253
listener?.onInit(viewHolder)
@@ -64,6 +65,12 @@ class ImageViewerAdapter(initKey: Long) : PagedListAdapter<Item, RecyclerView.Vi
6465
listener?.onRestore(viewHolder, view, fraction)
6566
}
6667
}
68+
69+
private fun provideItem(position: Int) = try {
70+
getItem(position) // IndexOutOfBoundsException Item count is zero, getItem() call is invalid
71+
} catch (e: Exception) {
72+
null
73+
}
6774
}
6875

6976
private val diff = object : DiffUtil.ItemCallback<Item>() {

imageviewer/src/main/java/com/github/iielse/imageviewer/core/Components.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.github.iielse.imageviewer.core
22

3-
import androidx.lifecycle.LifecycleOwner
43
import com.github.iielse.imageviewer.utils.log
54
import kotlin.IllegalStateException
65

@@ -37,10 +36,10 @@ object Components {
3736
Components.overlayCustomizer = overlayCustomizer
3837
}
3938

40-
fun requireImageLoader() = imageLoader!!
41-
fun requireDataProvider() = dataProvider!!
39+
fun requireImageLoader() = imageLoader ?: object : ImageLoader {}
40+
fun requireDataProvider() = dataProvider ?: object : DataProvider {}
4241
fun requireTransformer() = transformer ?: object : Transformer {}
43-
fun requireInitKey() = initKey!!
42+
fun requireInitKey() = initKey ?: 0
4443
fun requireVHCustomizer() = vhCustomizer ?: object : VHCustomizer {}
4544
fun requireViewerCallback() = viewerCallback ?: object : ViewerCallback {}
4645
fun requireOverlayCustomizer() = overlayCustomizer ?: object : OverlayCustomizer {}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.iielse.imageviewer.core
22

33
interface DataProvider {
4-
fun loadInitial(): List<Photo>
5-
fun loadAfter(key: Long, callback: (List<Photo>) -> Unit)
6-
fun loadBefore(key: Long, callback: (List<Photo>) -> Unit)
4+
fun loadInitial(): List<Photo> = emptyList()
5+
fun loadAfter(key: Long, callback: (List<Photo>) -> Unit) {}
6+
fun loadBefore(key: Long, callback: (List<Photo>) -> Unit) {}
77
}

imageviewer/src/main/java/com/github/iielse/imageviewer/core/ImageLoader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ import androidx.recyclerview.widget.RecyclerView
55
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
66

77
interface ImageLoader {
8-
fun load(view: ImageView, data: Photo, viewHolder: RecyclerView.ViewHolder)
9-
fun load(subsamplingView: SubsamplingScaleImageView, data: Photo, viewHolder: RecyclerView.ViewHolder)
8+
fun load(view: ImageView, data: Photo, viewHolder: RecyclerView.ViewHolder) {}
9+
fun load(subsamplingView: SubsamplingScaleImageView, data: Photo, viewHolder: RecyclerView.ViewHolder) {}
1010
}

0 commit comments

Comments
 (0)