fix: paging fixed

This commit is contained in:
a1pha 2025-02-20 18:18:57 +03:00
parent c3adf16666
commit aba81f744f
4 changed files with 61 additions and 39 deletions

View File

@ -1,14 +1,14 @@
package ru.myitschool.work.ui.admin.search package ru.myitschool.work.ui.admin.search
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.CreationExtras
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.cachedIn import androidx.paging.cachedIn
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -38,17 +38,18 @@ class AdminViewModel(
private val _state = MutableStateFlow<State>(State.Waiting) private val _state = MutableStateFlow<State>(State.Waiting)
val state = _state.asStateFlow() val state = _state.asStateFlow()
// private var _listState: Flow<PagingData<PassEntity>>? = null private val _listState = MutableLiveData<Pager<Int, PassEntity>>()
// val listState: Flow<PagingData<PassEntity>> get() = _listState!! val listState = _listState.value?.flow?.cachedIn(viewModelScope)
private var currentLogin: String = "pivanov" private val _currentLogin = MutableLiveData<String>()
private val currentLogin: LiveData<String> get() = _currentLogin
fun onFind(login: String) { fun onFind(login: String) {
viewModelScope.launch { viewModelScope.launch {
_state.emit(State.Loading) _state.emit(State.Loading)
getUserByLoginUseCase(login).fold( getUserByLoginUseCase(login).fold(
onSuccess = { data -> onSuccess = { data ->
currentLogin = login _currentLogin.postValue(login)
_state.emit(State.Show(data)) _state.emit(State.Show(data))
setUpPager(login) setUpPager(login)
}, },
@ -64,7 +65,7 @@ class AdminViewModel(
private fun updateState() { private fun updateState() {
viewModelScope.launch { viewModelScope.launch {
_state.emit(State.Loading) _state.emit(State.Loading)
getUserByLoginUseCase(currentLogin!!).fold( getUserByLoginUseCase(currentLogin.value!!).fold(
onSuccess = { _state.emit(State.Show(it)) }, onSuccess = { _state.emit(State.Show(it)) },
onFailure = { _state.emit(State.Error(it.message.toString())) } onFailure = { _state.emit(State.Error(it.message.toString())) }
) )
@ -72,27 +73,26 @@ class AdminViewModel(
} }
private fun setUpPager(login: String) { private fun setUpPager(login: String) {
// _listState = Pager( _listState.value = Pager(
// config = PagingConfig( config = PagingConfig(
// pageSize = 10, pageSize = 10,
// enablePlaceholders = false, enablePlaceholders = false,
// maxSize = 50 maxSize = 50
// ) )
// ) { ) {
// UsersPassesPagingSource(getUsersPassesUseCase::invoke, login) UsersPassesPagingSource(getUsersPassesUseCase::invoke, login)
// }.flow }
// .cachedIn(viewModelScope)
} }
fun onBlock() { fun onBlock() {
viewModelScope.launch { viewModelScope.launch {
blockUserUseCase(currentLogin!!) blockUserUseCase(currentLogin.value!!)
} }
} }
fun unblock() { fun unblock() {
viewModelScope.launch { viewModelScope.launch {
unBlockUserUseCase(currentLogin!!) unBlockUserUseCase(currentLogin.value!!)
} }
} }

View File

@ -27,6 +27,9 @@ class ViewUserAsAdminFragment : Fragment(R.layout.fragment_user) {
binding.findUser.visibleOrGone(false) binding.findUser.visibleOrGone(false)
binding.logout.visibleOrGone(false) binding.logout.visibleOrGone(false)
val adapter = PassesListAdapter()
binding.passes.adapter = adapter
viewModel.state.collectWithLifecycle(this) { state -> viewModel.state.collectWithLifecycle(this) { state ->
binding.refresh.isRefreshing = state is AdminViewModel.State.Loading binding.refresh.isRefreshing = state is AdminViewModel.State.Loading
binding.content.visibleOrGone(state is AdminViewModel.State.Show) binding.content.visibleOrGone(state is AdminViewModel.State.Show)
@ -48,23 +51,23 @@ class ViewUserAsAdminFragment : Fragment(R.layout.fragment_user) {
} }
} }
// viewModel.listState.collectWithLifecycle(this) { listState -> viewModel.listState?.collectWithLifecycle(this) { listState ->
// adapter.submitData(listState) adapter.submitData(listState)
// } }
// adapter.loadStateFlow.collectWithLifecycle(this) { data -> adapter.loadStateFlow.collectWithLifecycle(this) { data ->
// val dataState = data.refresh val dataState = data.refresh
// binding.refresh.isRefreshing = dataState is LoadState.Loading binding.refresh.isRefreshing = dataState is LoadState.Loading
// binding.error.visibleOrGone(dataState is LoadState.Error) binding.error.visibleOrGone(dataState is LoadState.Error)
//
// if (dataState is LoadState.Error) { if (dataState is LoadState.Error) {
// binding.error.text = dataState.error.toString() binding.error.text = dataState.error.toString()
// } }
// } }
binding.refresh.setOnRefreshListener { binding.refresh.setOnRefreshListener {
viewModel.onRefresh() viewModel.onRefresh()
// adapter.refresh() adapter.refresh()
} }

View File

@ -1,17 +1,15 @@
package ru.myitschool.work.ui.profile package ru.myitschool.work.ui.profile
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.paging.PagingDataAdapter import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import ru.myitschool.work.databinding.PassItemBinding import ru.myitschool.work.databinding.PassItemBinding
import ru.myitschool.work.domain.entities.PassEntity import ru.myitschool.work.domain.entities.PassEntity
class PassesListAdapter: class PassesListAdapter :
ListAdapter<PassEntity, PassesListAdapter.ViewHolder>(CenterDiff) { PagingDataAdapter<PassEntity, PassesListAdapter.ViewHolder>(CenterDiff) {
class ViewHolder( class ViewHolder(
private val binding: PassItemBinding, private val binding: PassItemBinding,
@ -40,6 +38,12 @@ class PassesListAdapter:
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position)) holder.bind(
getItem(position) ?: PassEntity(
type = "Loading...",
name = "Loading...",
time = "Loading..."
)
)
} }
} }

View File

@ -7,6 +7,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.paging.LoadState
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import ru.myitschool.work.R import ru.myitschool.work.R
import ru.myitschool.work.databinding.FragmentUserBinding import ru.myitschool.work.databinding.FragmentUserBinding
@ -36,20 +37,34 @@ class UserFragment : Fragment(R.layout.fragment_user) {
is UserViewModel.State.Loading -> Unit is UserViewModel.State.Loading -> Unit
is UserViewModel.State.Show -> { is UserViewModel.State.Show -> {
val user = state.userEntity val user = state.userEntity
adapter.submitList(state.passes)
binding.scan.visibleOrGone(!user.isCardBlocked) binding.scan.visibleOrGone(!user.isCardBlocked)
binding.findUser.visibleOrGone(user.isAdmin) binding.findUser.visibleOrGone(user.isAdmin)
binding.fullname.text = user.name binding.fullname.text = user.name
binding.position.text = user.position binding.position.text = user.position
binding.lastEntry.text = user.lastVisit binding.lastEntry.text = user.lastVisit
Picasso.get().load(user.photoUrl).into(binding.photo) Picasso.get().load(user.photoUrl).into(binding.photo)
} }
} }
} }
viewModel.listState.collectWithLifecycle(this) { listState ->
adapter.submitData(listState)
}
adapter.loadStateFlow.collectWithLifecycle(this) { data ->
Log.d("info", data.refresh.toString())
val dataState = data.refresh
binding.refresh.isRefreshing = dataState is LoadState.Loading
binding.error.visibleOrGone(dataState is LoadState.Error)
if (dataState is LoadState.Error) {
binding.error.text = dataState.error.toString()
}
}
binding.refresh.setOnRefreshListener { binding.refresh.setOnRefreshListener {
viewModel.onRefresh() viewModel.onRefresh()
adapter.refresh()
} }
binding.logout.setOnClickListener { binding.logout.setOnClickListener {