app: switch to Paging

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-12-06 01:08:36 +05:30
parent d0d08f8a3c
commit 343f7e7f56
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 28 additions and 15 deletions

View file

@ -23,8 +23,8 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.navigate
import androidx.navigation.compose.rememberNavController
import androidx.paging.compose.collectAsLazyPagingItems
import dagger.hilt.android.AndroidEntryPoint
import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.util.IconResource
import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel
import dev.msfjarvis.lobsters.ui.navigation.Destination
@ -55,7 +55,7 @@ class MainActivity : AppCompatActivity() {
fun LobstersApp() {
val viewModel: LobstersViewModel = viewModel()
val navController = rememberNavController()
val hottestPosts = emptyList<LobstersPost>()
val hottestPosts = viewModel.posts.collectAsLazyPagingItems()
val savedPosts by viewModel.savedPosts.collectAsState()
Scaffold(

View file

@ -1,37 +1,43 @@
package dev.msfjarvis.lobsters.ui.posts
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumnFor
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.items
import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncherAmbient
@Composable
fun HottestPosts(
posts: List<LobstersPost>,
posts: LazyPagingItems<LobstersPost>,
listState: LazyListState,
modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit,
) {
val urlLauncher = UrlLauncherAmbient.current
if (posts.isEmpty()) {
if (posts.loadState.refresh == LoadState.Loading) {
EmptyList(saved = false)
} else {
LazyColumnFor(
items = posts,
LazyColumn(
state = listState,
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { item ->
LobstersItem(
post = item,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
onLongClick = { urlLauncher.launch(item.commentsUrl) },
onSaveButtonClick = { saveAction.invoke(item) },
)
modifier = Modifier.padding(horizontal = 8.dp).then(modifier),
) {
items(posts) { item ->
if (item != null) {
LobstersItem(
post = item,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
onLongClick = { urlLauncher.launch(item.commentsUrl) },
onSaveButtonClick = { saveAction.invoke(item) },
)
}
}
}
}
}

View file

@ -3,6 +3,9 @@ package dev.msfjarvis.lobsters.ui.viewmodel
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingConfig
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
import dev.msfjarvis.lobsters.data.source.PostsDatabase
import dev.msfjarvis.lobsters.model.LobstersPost
import kotlinx.coroutines.flow.MutableStateFlow
@ -11,11 +14,15 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class LobstersViewModel @ViewModelInject constructor(
private val pagingSource: LobstersPagingSource,
database: PostsDatabase,
) : ViewModel() {
private val _savedPosts = MutableStateFlow<List<LobstersPost>>(emptyList())
private val savedPostsDao = database.savedPostsDao()
val savedPosts: StateFlow<List<LobstersPost>> get() = _savedPosts
val posts = Pager(PagingConfig(25)) {
pagingSource
}.flow
init {
getSavedPosts()