如何使用Retrofit在recyclerView中正确加载更多项目? (科特林)

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

我是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
3个回答

0
投票

问题在于:

.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()


0
投票

@ 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))
    }
© www.soinside.com 2019 - 2024. All rights reserved.