使用SwipeRefreshLayout获取数据

问题描述

我正在使用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 (将#修改为@)