RecyclerView перейти наверх после клика даже - PullRequest
0 голосов
/ 24 февраля 2020

У меня была эта проблема в течение долгого времени, и я пробовал разные предложения на похожих постах, но все они оказались бесполезными.

В настоящее время у меня есть обзор реселлера, который реализует двойной щелчок для лайков. Всякий раз, когда я делаю это, просмотрщик переходит к началу страницы.

Пожалуйста, посоветуйте, что нужно сделать, чтобы остановить это.

Код

    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)
    }


}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы можете перейти в начальную позицию, используя этот пример:

Пример

LinearLayoutManager layoutManager = (LinearLayoutManager) 
   mRecyclerView.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0, 0);
0 голосов
/ 27 февраля 2020

Как я прочитал выше комментарии к вашему вопросу. Вы используете комнатную базу данных, и если в предмете есть какие-либо изменения, он обновит sh весь список вместо одного.

Существует два способа сделать это.

  1. Добавьте ListAdapter вместо простого адаптера вьюблера. Этот адаптер имеет метод submit (), который сравнивает текущее значение адаптера и новые значения, которые будут обновлены, и его значение только для обновления, которые изменяются не весь список.

  2. Выполните вышеперечисленные операции над адаптером и используйте для уведомления об одном элементе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...