Mvvm 使用SwipeRefreshLayout获取数据
我正在使用SwipeRefreshLayout获取数据。 问题是在我添加/删除API端的项目后,数据没有更新 从存储库、视图模型和视图。 我的期望是:在我更改API端的某些内容后,我按住并滚动列表,应用端=>列表将被更新。 非常感谢 存储库Mvvm 使用SwipeRefreshLayout获取数据,mvvm,swiperefreshlayout,Mvvm,Swiperefreshlayout,我正在使用SwipeRefreshLayout获取数据。 问题是在我添加/删除API端的项目后,数据没有更新 从存储库、视图模型和视图。 我的期望是:在我更改API端的某些内容后,我按住并滚动列表,应用端=>列表将被更新。 非常感谢 存储库 class MoviesRepository( private val api: MoviesApi, private val db: AppDatabase, private val prefs: PreferenceProvider, private v
class MoviesRepository(
private val api: MoviesApi,
private val db: AppDatabase,
private val prefs: PreferenceProvider,
private val netWorkConnectionIntercepter: NetWorkConnectionIntercepter) : SafeApiRequest() {
private var movies = MutableLiveData<List<Movie>>()
init {
movies.observeForever {
saveMovies(it)
}
}
suspend fun getMovies(): LiveData<List<Movie>> {
return withContext(Dispatchers.IO) {
fetchMovies2()
db.getMovieDao().getMovies()
}
}
private suspend fun fetchMovies() {
val lastSaveVideoAt = prefs.getLastSaveMoviedAt()
if (netWorkConnectionIntercepter.isInternetAvailable()) {
if ((lastSaveVideoAt == null)
|| (isFetchNeeded(lastSaveVideoAt.toLong()))
) {
movies.postValue(apiRequest { api.getMovies() })
}
}
}
private suspend fun fetchMovies2() {
movies.postValue(apiRequest { api.getMovies() })
}
private fun isFetchNeeded(saveAt: Long): Boolean {
return saveAt + Common.TIME_TO_FETCH_DATA < System.currentTimeMillis()
}
private fun saveMovies(movies: List<Movie>?) {
Coroutines.io {
if (movies != null) {
db.getMovieDao().deleteAllMovies()
db.getMovieDao().saveAllMovies(movies)
prefs.savelastSaveMovieAt(System.currentTimeMillis().toString())
}
}
} }
片段:
class MoviesFragment : Fragment(), RrcycleclerViewClickListener, KodeinAware {
override val kodein by kodein()
private val factory by instance<MoviesViewModelFactory>()
private lateinit var viewModel: MoviesViewModel
private lateinit var movies: List<Movie>
private lateinit var mAdapter: MoviesAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.movies_fragment, container, false)
viewModel = ViewModelProvider(this, factory).get(MoviesViewModel::class.java)
movies = ArrayList<Movie>()
mAdapter = MoviesAdapter(movies as ArrayList<Movie>, this)
view.recycler_view_movies.also {
it.layoutManager = LinearLayoutManager(requireContext())
it.setHasFixedSize(true)
it.adapter = mAdapter
}
updateVideoUI()
view.refreshLayout.setOnRefreshListener {
Coroutines.main {
val movies = viewModel.movies.await()
if (view != null) {
movies.observe(viewLifecycleOwner, Observer { movieList ->
mAdapter.updateVideo(movieList)
})
}
refreshLayout.isRefreshing = false
}
}
return view
}
fun updateVideoUI() {
Coroutines.main {
progress_bar_movies.show()
refreshLayout.isRefreshing = true
val movies = viewModel.movies.await()
if (view != null) {
movies.observe(viewLifecycleOwner, Observer { movieList ->
progress_bar_movies.hide()
Log.d("Vip", "onCreateView: "+movieList.size)
mAdapter.updateVideo(movieList)
})
}
refreshLayout.isRefreshing = false
}
}
override fun onRecyclerViewItemOnclick(view: View, movie: Movie) {
when (view.id) {
R.id.button_book -> {
findNavController().navigate(R.id.action_moviesFragment_to_movieDetailFragment)
}
}
}}
class MoviesFragment:Fragment(),RRCycleCerviceWClickListener,KodeinAware{
通过kodein()覆盖val kodein
私有val工厂(按实例)()
私有lateinit var viewModel:MoviesViewModel
私有lateinit var电影:列表
私有lateinit var mAdapter:MoviesAdapter
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
val视图=充气机。充气(R.layout.U碎片,容器,错误)
viewModel=ViewModelProvider(这个,工厂).get(MoviesViewModel::class.java)
movies=ArrayList()
mAdapter=MoviesAdapter(电影作为ArrayList,此)
view.recycler\u查看\u电影{
it.layoutManager=LinearLayoutManager(requireContext())
it.setHasFixedSize(true)
it.adapter=mAdapter
}
updateVideoUI()
view.refreshLayout.setOnRefreshListener{
共程{
val movies=viewModel.movies.await()
如果(视图!=null){
movies.observe(viewLifecycleOwner,Observer{movieList->
mAdapter.updateVideo(电影列表)
})
}
refreshLayout.isRefreshing=false
}
}
返回视图
}
fun updateVideoUI(){
共程{
进步吧电影秀()
refreshLayout.isRefreshing=true
val movies=viewModel.movies.await()
如果(视图!=null){
movies.observe(viewLifecycleOwner,Observer{movieList->
进度条电影。隐藏()
Log.d(“Vip”,“onCreateView:+movieList.size”)
mAdapter.updateVideo(电影列表)
})
}
refreshLayout.isRefreshing=false
}
}
覆盖有趣的OnRecycleServiceItemonClick(视图:视图,电影:电影){
何时(view.id){
R.id.按钮\u书->{
findNavController().导航(R.id.action\u moviesFragment\u到\u movieDetailFragment)
}
}
}}
class MoviesFragment : Fragment(), RrcycleclerViewClickListener, KodeinAware {
override val kodein by kodein()
private val factory by instance<MoviesViewModelFactory>()
private lateinit var viewModel: MoviesViewModel
private lateinit var movies: List<Movie>
private lateinit var mAdapter: MoviesAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.movies_fragment, container, false)
viewModel = ViewModelProvider(this, factory).get(MoviesViewModel::class.java)
movies = ArrayList<Movie>()
mAdapter = MoviesAdapter(movies as ArrayList<Movie>, this)
view.recycler_view_movies.also {
it.layoutManager = LinearLayoutManager(requireContext())
it.setHasFixedSize(true)
it.adapter = mAdapter
}
updateVideoUI()
view.refreshLayout.setOnRefreshListener {
Coroutines.main {
val movies = viewModel.movies.await()
if (view != null) {
movies.observe(viewLifecycleOwner, Observer { movieList ->
mAdapter.updateVideo(movieList)
})
}
refreshLayout.isRefreshing = false
}
}
return view
}
fun updateVideoUI() {
Coroutines.main {
progress_bar_movies.show()
refreshLayout.isRefreshing = true
val movies = viewModel.movies.await()
if (view != null) {
movies.observe(viewLifecycleOwner, Observer { movieList ->
progress_bar_movies.hide()
Log.d("Vip", "onCreateView: "+movieList.size)
mAdapter.updateVideo(movieList)
})
}
refreshLayout.isRefreshing = false
}
}
override fun onRecyclerViewItemOnclick(view: View, movie: Movie) {
when (view.id) {
R.id.button_book -> {
findNavController().navigate(R.id.action_moviesFragment_to_movieDetailFragment)
}
}
}}