我无法从 API 显示我的数据?科特林安卓

问题描述 投票:0回答:1

第一个是我的仓库:https://github.com/Berkayszk/FiWoApp

我正在使用改造和分页适配器获取数据。当我想在 MovieFragment 中使用 recyclerView 显示数据时,我发现没有数据传入。出现这个错误的原因是什么?我已经处理这个问题三天了,但找不到解决方案。

电影片段 = 显示我的电影。

@AndroidEntryPoint
class MovieFragment : Fragment(R.layout.fragment_movie) {

private var _binding: FragmentMovieBinding? = null
private val binding get() = _binding!!
private val viewModel: MovieViewModel by viewModels()
private lateinit var movieAdapter: PopularMovieAdapter
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    // Inflate the layout for this fragment
    _binding = FragmentMovieBinding.inflate(layoutInflater, container, false)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    loadingData()
    setUpRv()
}


private fun loadingData() {

        movieAdapter = PopularMovieAdapter()
        lifecycleScope.launch {
            viewModel.moviesList.collect { pagingData ->
                movieAdapter.submitData(pagingData)

            }
        }
}
private fun setUpRv(){
    movieAdapter = PopularMovieAdapter()
    binding.recyclerView.apply {

        layoutManager = StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
        adapter = movieAdapter
        setHasFixedSize(true)
    }

}
override fun onDestroy() {
    super.onDestroy()
    _binding = null
}

}

PopularMovieAdapter = 分页适配器

 class PopularMovieAdapter :  PagingDataAdapter<com.example.fiwoapp.model.popularmovie.Result,PopularMovieAdapter.PopularMovieHo lder>(
diffCallBack) {
class PopularMovieHolder(val binding : PopularMovieRowBinding) : ViewHolder(binding.root)

companion object {
 val diffCallBack = object : DiffUtil.ItemCallback<com.example.fiwoapp.model.popularmovie.Result>(){
    override fun areItemsTheSame(oldItem: com.example.fiwoapp.model.popularmovie.Result, newItem: com.example.fiwoapp.model.popularmovie.Result): Boolean {
        return oldItem.id==newItem.id
    }

    override fun areContentsTheSame(oldItem: com.example.fiwoapp.model.popularmovie.Result, newItem: com.example.fiwoapp.model.popularmovie.Result): Boolean {
        return oldItem == newItem
    }
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PopularMovieHolder {
    return PopularMovieHolder(PopularMovieRowBinding.inflate(LayoutInflater.from(parent.context),parent,false))
}

override fun onBindViewHolder(holder: PopularMovieHolder, position: Int) {
    val currentItem = getItem(position)
    holder.binding.apply {
        movieName.text = currentItem!!.title
        val imageLink = "${Constants.IMAGE_BASE_UR}+${currentItem.poster_path}"
        imageView.load(imageLink){
            crossfade(true)
            crossfade(100)

        }
    }
}

分页来源

class PopularMovieSource(private val repository: MovieShowRepository) :PagingSource<Int,Result>(){

override suspend fun load(params: LoadParams<Int>): LoadResult<Int,Result> {
    return try {
        val currentPage = params.key ?: 1
        val response = repository.getPopularMovie(currentPage)
        val data = response.body()!!.results
        val responseData = mutableListOf<Result>()
        responseData.addAll(data)

        LoadResult.Page(
            data = responseData,
            prevKey = if (currentPage == 1) null else -1,
            nextKey = currentPage.plus(1)
        )
    } catch (e: Exception) {
        LoadResult.Error(e)
    } catch (exception: HttpException) {
        LoadResult.Error(exception)
    }

}

override fun getRefreshKey(state: PagingState<Int, com.example.fiwoapp.model.popularmovie.Result>): Int? {
    return null
}

我的视图模型

@HiltViewModel class MovieViewModel @Inject constructor(
private val repository: MovieShowRepository,
private val apiService: ApiService

) : ViewModel() {

val loading = MutableLiveData<Boolean>()

val moviesList = Pager(PagingConfig(1)) {
    PopularMovieSource(repository)
}.flow.cachedIn(viewModelScope)

//Api
val detailsMovie = MutableLiveData<DetailsResponse>()
fun loadDetailsMovie(id: Int) = viewModelScope.launch {
    loading.postValue(true)
    val response = repository.getMovieDetails(id)
    if (response.isSuccessful) {
        detailsMovie.postValue(response.body())
    }
    loading.postValue(false)
}

我的仓库

  class MovieShowRepository @Inject constructor(val apiService : ApiService){
  suspend fun getPopularMovie(page : Int) = apiService.getPopularMovie()
  suspend fun getMovieDetails(id:Int) = apiService.getMovieDetails(id)

您可以在我的存储库中看到我的所有其余代码。当我的应用程序运行时,我没有收到任何错误,但它没有显示在任何产量中。当我检查不同的存储库时,我发现该应用程序在与我具有相同代码行的项目中工作,但在我的项目中不起作用,如果您提供帮助,非常感谢。

android kotlin android-paging
1个回答
0
投票

错误:

private fun loadingData() {
    movieAdapter = PopularMovieAdapter()
    lifecycleScope.launch {
        viewModel.moviesList.collect { pagingData ->
            movieAdapter.submitData(pagingData)
        }
    }
}

private fun setUpRv() {
    movieAdapter = PopularMovieAdapter() // create a new adapter?
    binding.recyclerView.apply {
        layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
        adapter = movieAdapter
        setHasFixedSize(true)
    }
}

正确:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    setUpRv() // 1st - setup RV
    loadingData() // 2nd - load data
}


private fun loadingData() {
    lifecycleScope.launch {
        viewModel.moviesList.collect { pagingData ->
            movieAdapter.submitData(pagingData)
        }
    }
}

在您的代码中,

loadingData()
函数在
setUpRv()
函数之前被调用。因此,当调用
setUpRv()
时,会使用默认值而不是
movieAdapter
中的当前数据创建
pagingData

© www.soinside.com 2019 - 2024. All rights reserved.