问题描述
我正在使用SwipeRefreshLayout来获取数据。 问题是我在API端添加/删除项后数据没有更新。
从资源库,viewmodel和View。 我的期望是:在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())
}
}
} }
viewmodel:
class Moviesviewmodel(private val repository: MoviesRepository) : viewmodel() {
val movies by lazyDeferred {
repository.getMovies()
} }
片段:
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)
}
}
}}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)