首页 > 解决方案 > 将第一项滚动出屏幕后,水平 Recyclerview 跳回起始位置

问题描述

因此,我正在将 CMS 系统转换为我公司的应用程序,但我遇到了这个小错误,这让我非常恼火,我在 SO 上找不到任何符合我需求的答案。

我有一个回收站视图如下:

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/extra_item_list"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintBottom_toTopOf="@+id/add_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

适配器如下,输入是我从后端收到的几个视图类型。每个视图类型都会为用户弹出一个独特的布局,选择列表(来自 recyclerview 的项目)当前填充了您在适配器中看到的视图类型:

class ExtraItemAdapter(var callback: ApplicationActivity, var amount: Int, var input: Array<AllowedContentBlockTypes>, var givenPosition: Int) : RecyclerView.Adapter<ExtraItemAdapter.ViewHolder>(){
var currentPosition = 0

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.extra_item, parent, false))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val positioner = input[position]
    currentPosition = position
    when(callback) {
        is NewsChangeScreen -> {
            holder.itemView.setOnClickListener {
                when(positioner.type){
                    "text" -> {
                        val titleFormField = FormField()
                        titleFormField.id = "title"
                        titleFormField.label = positioner.label
                        titleFormField.type = positioner.type
                        (globalContext as NewsChangeScreen).listOfDynamicFormFields.add(titleFormField)
                    }
                    "wysiwyg" -> {
                        val wysiwygFormField = FormField()
                        wysiwygFormField.id = positioner.type
                        wysiwygFormField.label = positioner.label
                        wysiwygFormField.type = positioner.type
                        (globalContext as NewsChangeScreen).listOfDynamicFormFields.add(wysiwygFormField)
                    }
                    "media" -> {
                        val mediaFormField = FormField()
                        mediaFormField.id = positioner.type
                        mediaFormField.label = positioner.label
                        mediaFormField.type = positioner.type
                        (globalContext as NewsChangeScreen).listOfDynamicFormFields.add(mediaFormField)
                    }
                    "youtube" -> {
                        val youtubeFormField = FormField()
                        youtubeFormField.id = positioner.type
                        youtubeFormField.label = positioner.label
                        youtubeFormField.type = positioner.type
                        (globalContext as NewsChangeScreen).listOfDynamicFormFields.add(youtubeFormField)
                    }
                    "external_link" -> {
                        val externalLinkFormField = FormField()
                        externalLinkFormField.id = positioner.type
                        externalLinkFormField.label = positioner.label
                        externalLinkFormField.type = positioner.type
                        (globalContext as NewsChangeScreen).listOfDynamicFormFields.add(externalLinkFormField)
                    }
                }

                (globalContext as NewsChangeScreen).formFields.find { it.type == "mini_bm" }?.localData = (globalContext as NewsChangeScreen).listOfDynamicFormFields
                callback.save.visibility = View.VISIBLE
                setNewsChanges()
            }
        }
    }

    holder.itemView.item_title.text = positioner.label
    when(positioner.type){
        "text" -> {
            holder.itemView.setBackgroundResource(R.drawable.title_item_bg)
        }
        "wysiwyg" -> {
            holder.itemView.setBackgroundResource(R.drawable.text_block_item_bg)
        }
        "media" -> {
            holder.itemView.setBackgroundResource(R.drawable.image_item_bg)
        }
        "youtube" -> {
            holder.itemView.setBackgroundResource(R.drawable.youtube_item_bg)
        }
        "external_link" -> {
            holder.itemView.setBackgroundResource(R.drawable.link_item_bg)
        }
    }
}

private fun setNewsChanges(){
    (globalContext as NewsChangeScreen).hideExtraItemList()
    (globalContext as NewsChangeScreen).rotateFabBackward()
    (globalContext as NewsChangeScreen).rotated = false
    (globalContext as NewsChangeScreen).dynamic_news_list.adapter?.notifyItemChanged(currentPosition)
    (globalContext as NewsChangeScreen).dynamic_news_list.smoothScrollToPosition(((globalContext as NewsChangeScreen).listOfDynamicFormFields.size -1))
}

override fun getItemCount(): Int {
    return amount
}

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

}

现在我的问题是,当我向左滚动并且第一项超出屏幕时,它会立即跳回起始位置,如果我滚动并单击非常快,我只能单击最后一项。我尝试了一些已经在 SO 上提到的东西,但它们似乎都不起作用。我认为应该有一个非常简单的解决方案,但我似乎无法自己弄清楚。

PS。我知道 notifyItemChanged 部分没有意义,但由于列表始终是我事先已经给它的项目数量,只要它小于我拥有的项目的大小,我输入的数字无关紧要。

我希望有人可以在这里帮助我!

标签: javaandroidkotlinandroid-recyclerview

解决方案


推荐阅读