簡體   English   中英

Kotlin recyclerview 分頁重啟(Pagination)

[英]Kotlin recyclerview pagination restarts (Pagination)

我目前正在開發一個基於 TMDB 的 Kotlin 應用程序,試圖實現我實現的分頁,但是當添加更多項目時,recyclerview“重新啟動”(將我發送到列表頂部)。

我認為問題可能是我的適配器或我設置 recylerview 的方式。

有什么建議嗎?

我的適配器

class SearchMovieAdapter(val movieList: ArrayList<MovieData>, val listener: ClickListener) :
    RecyclerView.Adapter<SearchMovieAdapter.SearchViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchViewHolder {
        val view: LayoutInflater = LayoutInflater.from(parent.context)
        return SearchViewHolder(view.inflate(R.layout.search_item, parent, false))
    }

    override fun onBindViewHolder(holder: SearchViewHolder, position: Int) {
        return holder.bindInfo(movieList[position])
    }

    override fun getItemCount(): Int {
        return movieList.size
    }



    inner class SearchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemImage: ImageView = itemView.findViewById(R.id.imageFound)
        fun bindInfo(movie: MovieData) {
            itemView.setOnClickListener{
                //listener.OnItemClick(movie.id.toString(), image.context)
                listener.OnItemClick(movie, itemImage.context)
            }
            // title.text = movie.title
            if (movie.poster_path != null) {

                Picasso.get().load("https://image.tmdb.org/t/p/w500${movie.poster_path}")
                    .into(itemImage)
            }
        }

    }

執行

class SearchPage :
    ClickListener,
    AppCompatActivity() {
    private lateinit var editableText: EditText
    private lateinit var listOfSearchedMovies: RecyclerView
    var searchedQuery: ArrayList<MovieData> = ArrayList()
    var queryText: String = ""
    var indexPage = 1
    val indexLimit = 3
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_page)

        editableText = findViewById(R.id.buscarPeli)

        //When user click enter key on keyboard
        editableText.setOnKeyListener(View.OnKeyListener { _, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN) {
                //Perform Code
                val query: String = editableText.text.toString()
                queryText = query
                
                //Search movies data
                if (searchedQuery.isEmpty()) {
                    setSearchedTitle(query, indexPage.toString())
                }

                editableText.text.clear()
                hideKeyboard()
                Toast.makeText(this, query, Toast.LENGTH_SHORT).show()
                return@OnKeyListener true
            }
            false
        })


    }

    private fun hideKeyboard() {
        val view = this.currentFocus
        if (view != null) {
            val hide = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            hide.hideSoftInputFromWindow(view.windowToken, 0)
        }
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
    }

    private fun setSearchedTitle(query: String, index: String) {

        val retrofitBuilder = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(com.example.recyclerview.BASE_URL)
            .build()
            .create(API_interface::class.java)
        val retrofitData = retrofitBuilder.searchMovies(query, index)
        retrofitData.enqueue(object : Callback<MoviesResponse?> {
            override fun onResponse(
                call: Call<MoviesResponse?>,
                response: Response<MoviesResponse?>
            ) {
                if (response.isSuccessful) {
                    //searchedQuery.clear()
                    val totalResults = response.body()!!.results.size

                    for (i in 0 until totalResults)
                        searchedQuery.add(response.body()!!.results[i])
                }
                //Log.d("Respuesta", "Lista respuesta ${searchedQuery.size} ")
                //index=index+1
                setMoviesRecyclerView(searchedQuery)
            }

            override fun onFailure(call: Call<MoviesResponse?>, t: Throwable) {
                Toast.makeText(this@SearchPage, "${t.message}", Toast.LENGTH_SHORT).show()
            }
        })
    }


    private fun setMoviesRecyclerView(searchedQuery: ArrayList<MovieData>) {
        val loading: ProgressBar = findViewById(R.id.movieResultsLoading)
        listOfSearchedMovies = findViewById(R.id.searcheMovies)
        listOfSearchedMovies.apply {
            val layoutManager: RecyclerView.LayoutManager =
                GridLayoutManager(listOfSearchedMovies.context, 2)
            listOfSearchedMovies.layoutManager = layoutManager
            adapter = SearchMovieAdapter(searchedQuery, this@SearchPage)
            listOfSearchedMovies.addOnScrollListener(object : RecyclerView.OnScrollListener() {
                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                    super.onScrolled(recyclerView, dx, dy)
                    if (!recyclerView.canScrollVertically(1)) {
                        indexPage++
                        if (indexPage > indexLimit) {
                            Toast.makeText(
                                recyclerView.context,
                                "¡That's all!",
                                Toast.LENGTH_LONG
                            ).show()
                        } else {
                            setSearchedTitle(queryText, indexPage.toString())
                        }
                    }
                }
            })

        }
    }



}

我嘗試添加另一種方法來僅將項目添加到列表中,但是這樣做視圖不會刷新

問題是您每次收到一些新數據時都在初始化適配器。
嘗試在 SearchMovieAdapter class 中添加一個insertMovie函數, SearchMovieAdapter函數添加單個項目並通知其插入:

fun insertMovie(newMovie: MovieData) {
    this.movieList.add(newMovie)
    notifyItemInserted(movieList.size - 1)
}

然后在每次收到新的 object 時使用它來更新您的適配器:

retrofitData.enqueue(object : Callback<MoviesResponse?> {
            override fun onResponse(
                call: Call<MoviesResponse?>,
                response: Response<MoviesResponse?>
            ) {
                if (response.isSuccessful) {
                    //searchedQuery.clear()
                    val totalResults = response.body()!!.results.size

                    for (i in 0 until totalResults) {
                        adapter.insertMovie(response.body()!!.results[i])
                    }
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM