Skip to content

Commit c6b2f44

Browse files
committed
发布v1.3.0
1 parent 908baac commit c6b2f44

File tree

31 files changed

+683
-477
lines changed

31 files changed

+683
-477
lines changed

README.md

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
3838
```gradle
3939
// 极致体验的Compose刷新组件 (*必须)
40-
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh:1.2.0'
40+
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh:1.3.0'
4141
4242
// 经典样式的指示器 (可选)
43-
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-classic:1.2.0'
43+
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-classic:1.3.0'
4444
// Lottie动画指示器 (可选)
45-
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-lottie:1.2.0'
45+
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-lottie:1.3.0'
4646
// 进度条样式的指示器 (可选)
47-
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-progress:1.2.0'
47+
implementation 'com.github.jenly1314.UltraSwipeRefresh:refresh-indicator-progress:1.3.0'
4848
```
4949
5050
## 使用
@@ -74,6 +74,7 @@
7474
* @param dragMultiplier 触发下拉刷新或上拉加载时的阻力系数;值越小,阻力越大;默认为:0.5
7575
* @param finishDelayMillis 完成时延时时间;让完成时的中间状态[UltraSwipeRefreshState.isFinishing]停留一会儿,定格的展示提示内容;默认:500毫秒
7676
* @param vibrateEnabled 是否启用振动,如果启用则当滑动偏移量满足触发刷新或触发加载更多时,会有振动效果;默认为:false
77+
* @param alwaysScrollable 是否始终可以滚动;当为true时,则会忽略刷新中或加载中的状态限制,始终可以进行滚动;默认为:false
7778
* @param headerIndicator 下拉刷新时顶部显示的Header指示器
7879
* @param footerIndicator 上拉加载更多时底部显示的Footer指示器
7980
* @param contentContainer 内容的父容器,便于统一管理
@@ -91,34 +92,28 @@
9192
fun UltraSwipeRefreshSample() {
9293

9394
val state = rememberUltraSwipeRefreshState()
94-
9595
var itemCount by remember { mutableIntStateOf(20) }
96-
97-
LaunchedEffect(state.isRefreshing) {
98-
if (state.isRefreshing) {
99-
// TODO 刷新的逻辑处理,此处的延时只是为了演示效果
100-
delay(2000)
101-
itemCount = 20
102-
state.isRefreshing = false
103-
}
104-
}
105-
106-
LaunchedEffect(state.isLoading) {
107-
if (state.isLoading) {
108-
// TODO 加载更多的逻辑处理,此处的延时只是为了演示效果
109-
delay(2000)
110-
itemCount += 20
111-
state.isLoading = false
112-
}
113-
}
114-
96+
val coroutineScope = rememberCoroutineScope()
97+
11598
UltraSwipeRefresh(
11699
state = state,
117100
onRefresh = {
118-
state.isRefreshing = true
101+
coroutineScope.launch {
102+
state.isRefreshing = true
103+
// TODO 刷新的逻辑处理,此处的延时只是为了演示效果
104+
delay(2000)
105+
itemCount = 20
106+
state.isRefreshing = false
107+
}
119108
},
120109
onLoadMore = {
121-
state.isLoading = true
110+
coroutineScope.launch {
111+
state.isLoading = true
112+
// TODO 加载更多的逻辑处理,此处的延时只是为了演示效果
113+
delay(2000)
114+
itemCount += 20
115+
state.isLoading = false
116+
}
122117
},
123118
modifier = Modifier.background(color = Color(0x7FEEEEEE)),
124119
headerScrollMode = NestedScrollMode.Translate,
@@ -200,8 +195,10 @@ UltraSwipeRefreshTheme.config = UltraSwipeRefreshTheme.config.copy(
200195

201196
## 版本记录
202197

203-
#### 待发布版本([提前体验](test.md)
198+
#### v1.3.0 :2024-7-20
204199
* 更新compose至v1.6.0 (v1.5.0 -> v1.6.0) ([#13](https://github.com/jenly1314/UltraSwipeRefresh/issues/13)
200+
* 新增参数`alwaysScrollable`:是否始终可以滚动
201+
* 优化一些细节
205202

206203
#### v1.2.0 :2024-7-1
207204
* 新增参数`contentContainer`:内容的父容器,便于统一管理

app/build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ android {
3737
compose true
3838
}
3939
composeOptions {
40-
kotlinCompilerExtensionVersion '1.4.3'
40+
kotlinCompilerExtensionVersion versions.compose_compiler
4141
}
4242
lint {
4343
abortOnError false
@@ -61,7 +61,6 @@ dependencies {
6161
implementation "androidx.compose.material:material"
6262
implementation "androidx.compose.material3:material3:$versions.material3"
6363
implementation "androidx.navigation:navigation-compose:$versions.navigation_compose"
64-
implementation "androidx.navigation:navigation-compose:$versions.navigation_compose"
6564
implementation "com.google.accompanist:accompanist-swiperefresh:$versions.accompanist"
6665

6766
implementation "com.airbnb.android:lottie-compose:$versions.lottie_compose"

app/release/app-release.apk

1.65 MB
Binary file not shown.

app/release/output-metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
"type": "SINGLE",
1212
"filters": [],
1313
"attributes": [],
14-
"versionCode": 6,
15-
"versionName": "1.2.0",
14+
"versionCode": 7,
15+
"versionName": "1.3.0",
1616
"outputFile": "app-release.apk"
1717
}
1818
],

app/src/main/java/com/king/ultraswiperefresh/app/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.compose.foundation.layout.Column
77
import androidx.compose.foundation.layout.fillMaxSize
8-
import androidx.compose.material.Surface
9-
import androidx.compose.material.Text
8+
import androidx.compose.material3.Surface
9+
import androidx.compose.material3.Text
1010
import androidx.compose.material.TopAppBar
1111
import androidx.compose.runtime.Composable
1212
import androidx.compose.ui.Modifier

app/src/main/java/com/king/ultraswiperefresh/app/component/ColumnItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.compose.foundation.clickable
44
import androidx.compose.foundation.layout.Column
55
import androidx.compose.foundation.layout.fillMaxWidth
66
import androidx.compose.foundation.layout.padding
7-
import androidx.compose.material.Text
7+
import androidx.compose.material3.Text
88
import androidx.compose.runtime.Composable
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.graphics.Color
Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.king.ultraswiperefresh.app.sample
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.fillMaxWidth
46
import androidx.compose.foundation.layout.padding
57
import androidx.compose.foundation.lazy.LazyColumn
6-
import androidx.compose.material.Divider
7-
import androidx.compose.material.Text
8+
import androidx.compose.material3.HorizontalDivider
9+
import androidx.compose.material3.Text
810
import androidx.compose.runtime.Composable
911
import androidx.compose.runtime.LaunchedEffect
1012
import androidx.compose.runtime.getValue
1113
import androidx.compose.runtime.mutableIntStateOf
1214
import androidx.compose.runtime.mutableStateOf
1315
import androidx.compose.runtime.remember
16+
import androidx.compose.runtime.rememberCoroutineScope
1417
import androidx.compose.runtime.setValue
18+
import androidx.compose.ui.Alignment
1519
import androidx.compose.ui.Modifier
1620
import androidx.compose.ui.graphics.Color
1721
import androidx.compose.ui.unit.dp
@@ -22,6 +26,7 @@ import com.king.ultraswiperefresh.indicator.classic.ClassicRefreshFooter
2226
import com.king.ultraswiperefresh.indicator.classic.ClassicRefreshHeader
2327
import com.king.ultraswiperefresh.rememberUltraSwipeRefreshState
2428
import kotlinx.coroutines.delay
29+
import kotlinx.coroutines.launch
2530

2631
/**
2732
* 经典的刷新样式示例
@@ -34,59 +39,44 @@ import kotlinx.coroutines.delay
3439
fun ClassicRefreshIndicatorSample() {
3540

3641
val state = rememberUltraSwipeRefreshState()
37-
3842
var itemCount by remember { mutableIntStateOf(20) }
39-
4043
var hasMoreData by remember { mutableStateOf(true) }
41-
42-
LaunchedEffect(state.isRefreshing) {
43-
if (state.isRefreshing) {
44-
delay(2000)
45-
itemCount = 20
46-
hasMoreData = true
47-
state.isRefreshing = false
48-
}
49-
}
50-
51-
LaunchedEffect(state.isLoading) {
52-
if (state.isLoading) {
53-
delay(2000)
54-
itemCount += 20
55-
state.isLoading = false
56-
}
57-
}
44+
val coroutineScope = rememberCoroutineScope()
5845

5946
LaunchedEffect(state.isFinishing) {
60-
if (itemCount > 50 && !state.isFinishing) {
47+
if (itemCount >= 60 && !state.isFinishing) {
6148
hasMoreData = false
6249
}
6350
}
6451

6552
UltraSwipeRefresh(
6653
state = state,
6754
onRefresh = {
68-
state.isRefreshing = true
55+
coroutineScope.launch {
56+
state.isRefreshing = true
57+
// TODO 刷新的逻辑处理,此处的延时只是为了演示效果
58+
delay(2000)
59+
itemCount = 20
60+
hasMoreData = true
61+
state.isRefreshing = false
62+
}
6963
},
7064
onLoadMore = {
71-
if (hasMoreData) {
65+
coroutineScope.launch {
7266
state.isLoading = true
67+
// TODO 加载更多的逻辑处理,此处的延时只是为了演示效果
68+
delay(2000)
69+
itemCount += 20
70+
state.isLoading = false
7371
}
7472
},
7573
modifier = Modifier.background(color = Color(0x7FEEEEEE)),
74+
loadMoreEnabled = hasMoreData,
7675
headerIndicator = {
7776
ClassicRefreshHeader(it)
7877
},
7978
footerIndicator = {
80-
if (hasMoreData) {
81-
ClassicRefreshFooter(it)
82-
} else {
83-
Text(
84-
text = "———— 我也是有底线的 ————",
85-
color = Color(0xFF999999),
86-
fontSize = 15.sp,
87-
modifier = Modifier.padding(vertical = 16.dp)
88-
)
89-
}
79+
ClassicRefreshFooter(it)
9080
}
9181
) {
9282
LazyColumn(Modifier.background(color = Color.White)) {
@@ -95,12 +85,25 @@ fun ClassicRefreshIndicatorSample() {
9585
val title = "UltraSwipeRefresh列表标题${it + 1}"
9686
val content = "UltraSwipeRefresh列表内容${it + 1}"
9787
ColumnItem(title = title, content = content)
98-
Divider(
88+
HorizontalDivider(
9989
modifier = Modifier.padding(horizontal = 16.dp),
10090
color = Color(0xFFF2F3F6)
10191
)
10292
}
10393
}
94+
95+
if (!hasMoreData) {
96+
item {
97+
Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
98+
Text(
99+
text = "没有更多数据了",
100+
color = Color(0xFF999999),
101+
fontSize = 15.sp,
102+
modifier = Modifier.padding(vertical = 16.dp)
103+
)
104+
}
105+
}
106+
}
104107
}
105108
}
106109
}

app/src/main/java/com/king/ultraswiperefresh/app/sample/CustomLottieRefreshIndicatorSample.kt

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.fillMaxWidth
66
import androidx.compose.foundation.layout.padding
77
import androidx.compose.foundation.lazy.LazyColumn
8-
import androidx.compose.material.Divider
9-
import androidx.compose.material.Text
8+
import androidx.compose.material3.HorizontalDivider
9+
import androidx.compose.material3.Text
1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.runtime.LaunchedEffect
1212
import androidx.compose.runtime.getValue
1313
import androidx.compose.runtime.mutableIntStateOf
1414
import androidx.compose.runtime.mutableStateOf
1515
import androidx.compose.runtime.remember
16+
import androidx.compose.runtime.rememberCoroutineScope
1617
import androidx.compose.runtime.setValue
1718
import androidx.compose.ui.Alignment
1819
import androidx.compose.ui.Modifier
@@ -30,6 +31,7 @@ import com.king.ultraswiperefresh.indicator.lottie.LottieRefreshFooter
3031
import com.king.ultraswiperefresh.indicator.lottie.LottieRefreshHeader
3132
import com.king.ultraswiperefresh.rememberUltraSwipeRefreshState
3233
import kotlinx.coroutines.delay
34+
import kotlinx.coroutines.launch
3335

3436
/**
3537
* 自定义Lottie动画刷新样式示例
@@ -42,55 +44,50 @@ import kotlinx.coroutines.delay
4244
fun CustomLottieRefreshIndicatorSample() {
4345

4446
val state = rememberUltraSwipeRefreshState()
45-
4647
var itemCount by remember { mutableIntStateOf(20) }
47-
4848
var hasMoreData by remember { mutableStateOf(true) }
49+
val coroutineScope = rememberCoroutineScope()
4950

50-
LaunchedEffect(state.isRefreshing) {
51-
if (state.isRefreshing) {
52-
delay(2000)
53-
itemCount = 20
54-
hasMoreData = true
55-
state.isRefreshing = false
56-
}
51+
var headerScrollMode by remember {
52+
mutableStateOf(NestedScrollMode.FixedBehind)
5753
}
58-
59-
LaunchedEffect(state.isLoading) {
60-
if (state.isLoading) {
61-
delay(2000)
62-
itemCount += 20
63-
state.isLoading = false
64-
}
54+
var footerScrollMode by remember {
55+
mutableStateOf(NestedScrollMode.FixedBehind)
6556
}
6657

6758
LaunchedEffect(state.isFinishing) {
68-
if (itemCount > 50 && !state.isFinishing) {
59+
if (itemCount >= 60 && !state.isFinishing) {
6960
hasMoreData = false
7061
}
7162
}
7263

73-
var headerScrollMode by remember {
74-
mutableStateOf(NestedScrollMode.FixedBehind)
75-
}
76-
var footerScrollMode by remember {
77-
mutableStateOf(NestedScrollMode.FixedBehind)
78-
}
79-
8064
val context = LocalContext.current
8165

8266
UltraSwipeRefresh(
8367
state = state,
8468
onRefresh = {
85-
state.isRefreshing = true
69+
coroutineScope.launch {
70+
state.isRefreshing = true
71+
// TODO 刷新的逻辑处理,此处的延时只是为了演示效果
72+
delay(2000)
73+
itemCount = 20
74+
hasMoreData = true
75+
state.isRefreshing = false
76+
}
8677
},
8778
onLoadMore = {
88-
state.isLoading = true
79+
coroutineScope.launch {
80+
state.isLoading = true
81+
// TODO 加载更多的逻辑处理,此处的延时只是为了演示效果
82+
delay(2000)
83+
itemCount += 20
84+
state.isLoading = false
85+
}
8986
},
87+
modifier = Modifier.background(color = Color(0x7FEEEEEE)),
9088
headerScrollMode = headerScrollMode,
9189
footerScrollMode = footerScrollMode,
9290
loadMoreEnabled = hasMoreData,
93-
modifier = Modifier.background(color = Color(0x7FEEEEEE)),
9491
headerIndicator = {
9592
LottieRefreshHeader(
9693
state = it,
@@ -117,14 +114,17 @@ fun CustomLottieRefreshIndicatorSample() {
117114
footerScrollMode = nestedScrollModes.random()
118115
context.showToast("滑动模式已随机")
119116
}
120-
Divider(modifier = Modifier.padding(horizontal = 16.dp), color = Color(0xFFF2F3F6))
117+
HorizontalDivider(
118+
modifier = Modifier.padding(horizontal = 16.dp),
119+
color = Color(0xFFF2F3F6)
120+
)
121121
}
122122
repeat(itemCount) {
123123
item {
124124
val title = "UltraSwipeRefresh列表标题${it + 1}"
125125
val content = "UltraSwipeRefresh列表内容${it + 1}"
126126
ColumnItem(title = title, content = content)
127-
Divider(
127+
HorizontalDivider(
128128
modifier = Modifier.padding(horizontal = 16.dp),
129129
color = Color(0xFFF2F3F6)
130130
)

0 commit comments

Comments
 (0)