Skip to content

Commit d704ba6

Browse files
committed
update
1 parent 800969a commit d704ba6

File tree

9 files changed

+97
-35
lines changed

9 files changed

+97
-35
lines changed

app/src/main/java/com/wzq/jd/compose/app/data/RemoteDataRepo.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ class RemoteDataRepo(private val httpClient: HttpClient, private val baseUrl: St
2222
exception.printStackTrace()
2323
}
2424

25-
suspend fun getArticleList(pageNum: Int = 0, cid: String? = null) = httpClient.runCatching {
25+
suspend fun getArticleList(pageNum: Int = 0, cid: Int? = null) = httpClient.runCatching {
2626
get("${baseUrl}article/list/${pageNum}/json") {
2727
url {
28-
if (!cid.isNullOrEmpty()) {
28+
if (cid != null) {
2929
parameter("cid", cid)
3030
}
3131
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.wzq.jd.compose.app.page
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.material.icons.Icons
6+
import androidx.compose.material.icons.filled.Warning
7+
import androidx.compose.material3.Icon
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
12+
/**
13+
* create by wzq on 2023/12/14
14+
*
15+
*/
16+
@Composable
17+
fun ErrorScreen() {
18+
19+
Box(modifier = Modifier.fillMaxSize()) {
20+
Icon(
21+
Icons.Default.Warning,
22+
contentDescription = null,
23+
modifier = Modifier.align(Alignment.Center)
24+
)
25+
}
26+
}

app/src/main/java/com/wzq/jd/compose/app/page/MainNavGraph.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ private fun NavGraphBuilder.searchPage(navActions: NavActions) =
5454

5555
private fun NavGraphBuilder.categoryPage(navActions: NavActions) =
5656
composable(ScreenPath.Category.route, ScreenPath.Category.namedNavArguments) { backStackEntry ->
57-
val categories: Categories? = backStackEntry.arguments?.getParcelable("data")
58-
CategoryScreen(navActions = navActions, categories)
57+
// val categories: Categories? = backStackEntry.arguments?.getParcelable("data")
58+
// val position = backStackEntry.arguments?.getInt("position", 0)
59+
CategoryScreen(navActions = navActions, viewModel())
5960
}

app/src/main/java/com/wzq/jd/compose/app/page/ScreenRouter.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ sealed class ScreenPath(
1818
data object Home : ScreenPath("home")
1919

2020
data object Web : ScreenPath("web?url={url}") {
21-
fun getPath(url: String?) = "web?url=${url}"
21+
fun createPath(url: String?) = "web?url=${url}"
2222
}
2323

2424
data object Search : ScreenPath("search")
@@ -33,7 +33,7 @@ sealed class ScreenPath(
3333
),
3434
) {
3535

36-
fun getPath(position: Int) = "category?position=${position}"
36+
fun createPath(position: Int) = "category?position=${position}"
3737
}
3838
}
3939

@@ -43,15 +43,15 @@ interface CommonActions {
4343

4444
class NavActions(private val navController: NavController) : CommonActions {
4545
fun toWebScreen(url: String?) {
46-
navController.navigate(ScreenPath.Web.getPath(url))
46+
navController.navigate(ScreenPath.Web.createPath(url))
4747
}
4848

4949
fun toSearch() {
5050
navController.navigate(ScreenPath.Search.route)
5151
}
5252

5353
fun toCategory(position: Int = 0, categories: Categories) {
54-
val path = ScreenPath.Category.getPath(position)
54+
val path = ScreenPath.Category.createPath(position)
5555
navController.graph.findNode(path)?.id?.also { id ->
5656
navController.navigate(
5757
id,
Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
package com.wzq.jd.compose.app.page.categories
22

3+
import androidx.compose.runtime.mutableStateMapOf
34
import androidx.lifecycle.SavedStateHandle
45
import androidx.lifecycle.ViewModel
6+
import androidx.lifecycle.viewModelScope
7+
import com.wzq.jd.compose.app.data.NetworkUtil
8+
import com.wzq.jd.compose.app.data.model.ArticleItem
59
import com.wzq.jd.compose.app.data.model.Categories
10+
import kotlinx.coroutines.launch
611

712
/**
813
* create by wzq on 2023/12/11
914
*
1015
*/
11-
class CategoriesViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
12-
16+
class CategoriesViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
1317
val initPosition = savedStateHandle["position"] ?: 0
1418
val categories: Categories? = savedStateHandle["data"]
1519

20+
val pagerData = mutableStateMapOf<Int, List<ArticleItem>>()
21+
1622
init {
17-
println("a----$categories")
18-
println("${initPosition}----asdasdasd")
23+
getItemList(initPosition)
24+
}
25+
26+
fun getItemList(index: Int) {
27+
viewModelScope.launch {
28+
if (pagerData.containsKey(index)) {
29+
return@launch
30+
}
31+
val cid = categories?.children?.get(index)?.id
32+
NetworkUtil.remoteRepo.getArticleList(cid = cid).onSuccess { result ->
33+
pagerData[index] = result.data.listData
34+
}
35+
}
1936
}
2037

2138
}

app/src/main/java/com/wzq/jd/compose/app/page/categories/CategoryScreen.kt

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ package com.wzq.jd.compose.app.page.categories
22

33
import androidx.compose.foundation.ExperimentalFoundationApi
44
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.Box
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.fillMaxSize
78
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.lazy.LazyColumn
10+
import androidx.compose.foundation.lazy.items
811
import androidx.compose.foundation.pager.HorizontalPager
912
import androidx.compose.foundation.pager.rememberPagerState
1013
import androidx.compose.material.icons.Icons
1114
import androidx.compose.material.icons.filled.ArrowBack
1215
import androidx.compose.material3.CenterAlignedTopAppBar
16+
import androidx.compose.material3.CircularProgressIndicator
17+
import androidx.compose.material3.Divider
1318
import androidx.compose.material3.ExperimentalMaterial3Api
1419
import androidx.compose.material3.Icon
1520
import androidx.compose.material3.IconButton
@@ -22,11 +27,12 @@ import androidx.compose.runtime.Composable
2227
import androidx.compose.runtime.derivedStateOf
2328
import androidx.compose.runtime.remember
2429
import androidx.compose.runtime.rememberCoroutineScope
30+
import androidx.compose.ui.Alignment
2531
import androidx.compose.ui.Modifier
2632
import androidx.compose.ui.unit.dp
27-
import androidx.lifecycle.viewmodel.compose.viewModel
28-
import com.wzq.jd.compose.app.data.model.Categories
33+
import com.wzq.jd.compose.app.page.ErrorScreen
2934
import com.wzq.jd.compose.app.page.NavActions
35+
import com.wzq.jd.compose.app.page.home.ArticleItemPage
3036
import kotlinx.coroutines.launch
3137

3238
/**
@@ -36,12 +42,12 @@ import kotlinx.coroutines.launch
3642
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
3743
@Composable
3844
fun CategoryScreen(
39-
navActions: NavActions,
40-
categories: Categories?,
41-
viewModel: CategoriesViewModel = viewModel()
45+
navActions: NavActions, viewModel: CategoriesViewModel
4246
) {
47+
val categories = viewModel.categories
4348
val dataList = categories?.children
4449
if (dataList.isNullOrEmpty()) {
50+
ErrorScreen()
4551
return
4652
}
4753

@@ -67,26 +73,37 @@ fun CategoryScreen(
6773
},
6874
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = MaterialTheme.colorScheme.primaryContainer)
6975
)
70-
ScrollableTabRow(
71-
selectedTabIndex = currentSelectedIndex.value,
76+
ScrollableTabRow(selectedTabIndex = currentSelectedIndex.value,
7277
edgePadding = 0.dp,
7378
divider = {}) {
7479
dataList.forEachIndexed { index, knowledgeCategories ->
75-
Tab(
76-
selected = currentSelectedIndex.value == index,
77-
onClick = {
78-
scope.launch { pagerState.scrollToPage(index) }
79-
}) {
80+
Tab(selected = currentSelectedIndex.value == index, onClick = {
81+
scope.launch {
82+
viewModel.getItemList(index)
83+
pagerState.scrollToPage(index)
84+
}
85+
}) {
8086
Text(text = knowledgeCategories.name, modifier = Modifier.padding(8.dp))
8187
}
8288
}
8389

8490
}
91+
Divider(thickness = 8.dp)
8592
HorizontalPager(
86-
state = pagerState,
87-
beyondBoundsPageCount = 3
93+
state = pagerState, beyondBoundsPageCount = 3
8894
) { page ->
89-
Text(text = "item - >$page")
95+
val articleList = viewModel.pagerData[page]
96+
if (articleList.isNullOrEmpty()) {
97+
Box(modifier = Modifier.fillMaxSize()) {
98+
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
99+
}
100+
} else {
101+
LazyColumn(modifier = Modifier.fillMaxSize(), content = {
102+
items(articleList) {
103+
ArticleItemPage(itemData = it) { url -> navActions.toWebScreen(url) }
104+
}
105+
})
106+
}
90107
}
91108

92109
}

app/src/main/java/com/wzq/jd/compose/app/page/home/HomeCategoryPage.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,14 @@ fun HomeCategoryPage(
3333
}
3434
LazyColumn(content = {
3535
items(categories, key = { it.id }) {
36-
CategoryItem(it) { position ->
37-
onItemClick(it, position)
38-
}
36+
CategoryItem(it, onItemClick)
3937
}
4038
})
4139
}
4240

4341
@OptIn(ExperimentalLayoutApi::class)
4442
@Composable
45-
fun CategoryItem(category: Categories, onItemClick: (Int) -> Unit) {
43+
fun CategoryItem(category: Categories, onItemClick: (Categories, Int) -> Unit) {
4644
Column {
4745
Box(
4846
modifier = Modifier
@@ -65,7 +63,9 @@ fun CategoryItem(category: Categories, onItemClick: (Int) -> Unit) {
6563
horizontalArrangement = Arrangement.spacedBy(8.dp)
6664
) {
6765
category.children.forEachIndexed { index, item ->
68-
AssistChip(onClick = { onItemClick(index) }, label = { Text(text = item.name) })
66+
AssistChip(
67+
onClick = { onItemClick(category, index) },
68+
label = { Text(text = item.name) })
6969
}
7070
}
7171
}

app/src/main/java/com/wzq/jd/compose/app/page/home/HomeViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ class HomeViewModel : ViewModel() {
2424
getCategories()
2525
}
2626

27-
private fun getArticleList(pageNum: Int = 0, cid: String? = null) {
27+
private fun getArticleList(pageNum: Int = 0) {
2828
viewModelScope.launch {
29-
NetworkUtil.remoteRepo.getArticleList(pageNum, cid).onSuccess {
29+
NetworkUtil.remoteRepo.getArticleList(pageNum).onSuccess {
3030
homeList.clear()
3131
homeList.addAll(it.data.listData)
3232
}

app/src/main/java/com/wzq/jd/compose/app/page/web/WebScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.compose.runtime.remember
2828
import androidx.compose.ui.Modifier
2929
import androidx.compose.ui.viewinterop.AndroidView
3030
import com.wzq.jd.compose.app.page.CommonActions
31+
import com.wzq.jd.compose.app.page.ErrorScreen
3132

3233
/**
3334
* create by wzq on 2023/12/4
@@ -85,7 +86,7 @@ private fun CustomWebView(
8586
isRefreshing: MutableState<Boolean>
8687
) {
8788
if (url.isNullOrEmpty()) {
88-
// TODO: empty view
89+
ErrorScreen()
8990
return
9091
}
9192
AndroidView(modifier = Modifier

0 commit comments

Comments
 (0)