java - 单击事件后,RecyclerView跳到顶部

标签 java android kotlin android-recyclerview

我已经有很长时间了,在类似的帖子上尝试了不同的建议,但都被证明是徒劳的。

目前,我有一个实现了点赞双击的recyclerview。每当我这样做时,recyclerview就会跳到页面顶部。

请告知如何做才能阻止这种情况。



    private fun setDataIntoAdapter(list: List<MovieEntity?>?) {


        movieAdapter = MovieAdapter(list, object : MovieAdapter.OnMovieListener {
            override fun onMovieDoubleClick(movieEntity: MovieEntity, view: View) {

                val fav = view.findViewById<ImageView>(R.id.redFav)
//                var favMovie = convertToFavourityEntity(movieEntity)


                movieEntity.favourite = true
                if (fav.visibility == View.GONE) {
                    fav.visibility = View.VISIBLE


                    CoroutineScope(Main).launch {

                        try {
                            insertAndUpdate(movieEntity)
                            FancyToast.makeText(
                                context,
                                "${movieEntity.title} is added to favourite",
                                FancyToast.LENGTH_LONG,
                                FancyToast.SUCCESS,
                                true
                            ).show()
                        } catch (e: Exception) {

                            FancyToast.makeText(
                                context,
                                "Movie has been previously added \nto favorite",
                                FancyToast.LENGTH_LONG,
                                FancyToast.ERROR,
                                true
                            ).show()

                        }


                    }


                } else {
                    fav.visibility = View.GONE
                    movieEntity.favourite = false
                    CoroutineScope(Main).launch {

                        try {

                            deleteAndUpdate(movieEntity)
                            FancyToast.makeText(
                                context,
                                "${movieEntity.title} is removed from favourite",
                                FancyToast.LENGTH_LONG,
                                FancyToast.INFO,
                                true
                            ).show()
                        } catch (e: Exception) {

//                                        Toast.makeText(context, "Movie has been previously removed \nto favorite", Toast.LENGTH_SHORT).show()
                            val snackbar = Snackbar
                                .make(
                                    view, "Movie has been previously removed \n" +
                                            "to favorite", Snackbar.LENGTH_LONG
                                )
                            snackbar.show()
                        }


                    }
                }

            }

            override fun onSingleClick(movieEntity: MovieEntity, view: View) {


                gotoDetails(movieEntity)

//                view.deleteIcon.setOnClickListener {
//                    singleDeletion(movieEntity)
//                }

            }

        })
    }

  private suspend fun insertAndUpdate(movieEntity: MovieEntity) {
        ServiceLocator.createLocalDataSource(context!!).movieDao?.update(movieEntity)

    }



适配器

class MovieAdapter<T>(private var movies:List<T?>?, private var listener:OnMovieListener):RecyclerView.Adapter<MovieAdapter.MovieHolder>()  {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.movie_recycler_items, parent, false)
        return MovieAdapter.MovieHolder(itemView)
    }

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

    fun setMovie(movies: List<T?>?){
        this.movies = movies
        notifyDataSetChanged()
    }
    fun getMovieAt(position: Int):T?{
        return movies?.get(position)
    }
    override fun onBindViewHolder(holder: MovieHolder, position: Int) {
//        covert.drawCornerFlag(holder)
        movies?.let{
            val currentMovies = it[position]
            holder.bind(it[position]!!, listener)
        }
    }

    class MovieHolder(itemView: View): RecyclerView.ViewHolder(itemView) {


        var title = itemView.findViewById<TextView>(R.id.title)
        var releaseDate = itemView.findViewById<TextView>(R.id.releaseDate)
        var ratingBar = itemView.findViewById<RatingBar>(R.id.ratingBar)
        var imageThmbnail = itemView.findViewById<ImageView>(R.id.thumbnail)
        var fav = itemView.findViewById<ImageView>(R.id.favourite)
        var redFav = itemView.findViewById<ImageView>(R.id.redFav)
        var rating = itemView.findViewById<TextView>(R.id.rating)

        fun <T> bind(movieEntity: T, listener: OnMovieListener){

            var i = 0


            if(movieEntity is MovieEntity){
                if(movieEntity.favourite){
                    redFav.visibility = View.VISIBLE
                }
                else{
                    redFav.visibility = View.GONE
                }
                val calendar = Calendar.getInstance()
                val dateReleased = movieEntity.releaseDate?.split("-")
                val year = dateReleased?.get(0)?.toInt()
                val month = dateReleased?.get(1)?.toInt()
                val day = dateReleased?.get(2)?.toInt()
                var newDate:Date?= null
                if (year != null) {
                    if (month != null) {
                        if (day != null) {
                            calendar.set(year, month,day)
                        }

                    }
                    newDate = calendar.time
                }

                val displayDate = newDate.toString().substring(4..7) + year.toString()
                title.setText(movieEntity.title)
                releaseDate.setText(displayDate)
                ratingBar.numStars = 5
                val ratingNum = movieEntity.rating?.toFloat()?.div(2)
                rating.setText("${ratingNum!!}")
                ratingBar.rating = ratingNum
                Picasso.get().load(movieEntity.movieImage).into(imageThmbnail)
                itemView.setOnClickListener(DoubleClick(object :DoubleClickListener{
                    override fun onDoubleClick(view: View?) {

                        Log.i("Dob", "Double clicked")

                        listener.onMovieDoubleClick(movieEntity, itemView)
                    }

                    override fun onSingleClick(view: View?) {
                        Log.i("click", "Single click")
                        listener.onSingleClick(movieEntity, itemView)
                    }

                }))

            }

        }

    }

    interface OnMovieListener{
        fun onMovieDoubleClick(movieEntity: MovieEntity, view:View)
        fun onSingleClick(movieEntity: MovieEntity, view: View)
    }


}

最佳答案

您可以通过以下示例移至起始位置:



LinearLayoutManager layoutManager = (LinearLayoutManager) 
   mRecyclerView.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0, 0);

关于java - 单击事件后,RecyclerView跳到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60380247/

相关文章:

android - 协程中的自定义拦截器

java - 在位置 0 处插入字节并右移剩余数据位

java - 闰年和下一个闰年java

android - 如何在我的应用程序中使用 ScreenCap.cpp?

java - 使用setter的有效方法

Kotlin 可空性检查 if-else 功能方法...如何?

Kotlin 构造函数委托(delegate)给内部数据类?

java - 如何检测用户键盘是否在 Java 中的 AZERTY 中?

java - 使用 Java 从纯文本生成 HTML

android - soap 1.2 android 请提供有效的 soap 操作