【问题标题】:How to properly load more items in a recyclerView, using Retrofit ? (kotlin)如何使用 Retrofit 在 recyclerView 中正确加载更多项目? (科特林)
【发布时间】:2019-08-30 20:39:47
【问题描述】:

我是 Android Dev 的新手,实际上我正在 Kotlin 中从事一个个人项目,使用改造来进行 API 调用。

我已经在应用程序上实现了infiniteScroll,但这里的问题是当我点击页面底部时,我的项目会被新项目替换。

我不希望这种行为,我希望每个项目只是相互堆叠而不会丢失之前的项目。

在我的片段中,是我调用来重新填充我的视图的函数:

    private fun getPopularMovies(page: Int){
        val repository = MoviesRepositoryProvider.provideMovieRepository()
        repository.getPopularMovies(page)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe ({ result ->
                moviesAdapter = MovieAdapter(movies = result.results)
                moviesList.adapter = moviesAdapter
            }, { error ->
                error.printStackTrace()
            })
    }

【问题讨论】:

标签: android kotlin retrofit


【解决方案1】:

【讨论】:

    【解决方案2】:

    问题就在这里:

    .subscribe ({ result ->
       moviesAdapter = MovieAdapter(movies = result.results)
       moviesList.adapter = moviesAdapter
    }
    

    您正在为每个 api 响应创建一个新的适配器。您想设置一次适配器。然后你可以在每个响应上将结果传递给同一个适配器,并调用notifyDatasetChanged()

    类似:

    // Initial adapter set
    moviesAdapter = MovieAdapter()
    moviesList.adapter = moviesAdapter
    
    // Then on callback
    .subscribe ({ result ->
       moviesList.addResults(result.results)
    }
    

    然后在适配器内部,将新结果添加到您的列表中,然后调用adapter.notifyDataSetChanged()

    https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

    【讨论】:

    • 我认为这可以解决问题,我知道它是这样的,但由于我对这些真的很陌生,所以我不知道如何设置它,它不会再发生了 :D 我会告诉你它是否有效
    • 我遇到了一堆错误,我试图摆脱它们,但是,我认为你会比我更有效率 x) !当我尝试直接在片段中添加这些变量时,我得到未解决的引用错误:``` private var moviesAdapter = MovieAdapter(movies = result.results) private var moviesList.adapter = moviesAdapter ``` 在回调中,addResult 也是一个未解决的参考 对于 adapter.notifyDataSetChanged() 我不知道该放在哪里...谢谢!
    • 对于 MovieAdapter,使用空构造函数进行初始化,因为您还没有参考结果,private var moviesAdapter = MovieAdapter()moviesList 必须首先引用 recyclerview,例如使用 findViewById,它必须在您的代码中某处,您没有发布该部分。 addResults 是你需要定义的方法....
    【解决方案3】:

    @veritas1 是对的 但为了正确纠正我的错误,我必须这样做:

    所有这些都在我的片段中。

    首先声明适配器,以及将包含我的信息的数组:

        private var moviesAdapter: MovieAdapter? = null
        private var movies = ArrayList<Movie>()
    

    并在回调中,获取上一个请求,然后调用 notifyDataSetChanged()

        movies.addAll(result.results)
        moviesAdapter!!.notifyDataSetChanged()
    

    由于我使用的是 recyclerView,我必须正确设置我的适配器

        private fun initRecyclerView(){
            moviesList.apply {layoutManager = layoutMng}
            moviesList.adapter = moviesAdapter
            moviesList.addOnScrollListener(
                InfiniteScrollListener({getPopularMovies(page)},{nextPage()}, layoutMng))
        }
    

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2021-12-23
      • 2021-11-28
      • 2018-05-25
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      相关资源
      最近更新 更多