Mvvm 使用SwipeRefreshLayout获取数据

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

我正在使用SwipeRefreshLayout获取数据。 问题是在我添加/删除API端的项目后,数据没有更新

从存储库、视图模型和视图。 我的期望是:在我更改API端的某些内容后,我按住并滚动列表,应用端=>列表将被更新。 非常感谢

存储库

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)
        }
    }
}}