【问题标题】:Programatically Scroll at the last position of recyclerview on header click以编程方式在标题单击时滚动到 recyclerview 的最后一个位置
【发布时间】:2021-08-06 15:09:45
【问题描述】:

我有一个带有 netstedScroll 和一个 recyclerView 的视图,我用它来显示我的数据,所以我的片段是这样的:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.core.widget.NestedScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent">

<androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:itemCount="10"
                tools:listitem="@layout/row_header" />
</androidx.core.widget.NestedScrollView>

recyclerview 有一个自定义适配器,我使用它来获得与可扩展视图相同的 recyclerview(我没有使用原生视图),在我上次更新之前一切都很好,所以我们决定添加更多 KPI 和信息在 recyclerview 上变成了视图的最底部:

现在的问题是,当用户点击协商时,如果不手动滚动,商品列表不会自动显示,感觉没有任何变化。 我只想点击这部分,滚动,问题是我使用的是自定义适配器:

private fun bindHeaderViewHolder(holder: RecyclerView.ViewHolder, position: Int, viewType: ViewType) {
        val dataIndex = viewType.dataIndex
        val headerViewHolder = holder as SectionHeaderViewHolder
        when(position){
           
            0 -> headerViewHolder.sectionTitle.text = "Sold out"
            1 -> headerViewHolder.sectionTitle.text = "Rent"
            2 -> headerViewHolder.sectionTitle.text = "On stock"
            3 -> headerViewHolder.sectionTitle.text = "Negociating"
        }
if (isExpanded(position)) {
            headerViewHolder.expandIcon.setImageResource(R.drawable.ic_expand_less_black_24dp)
            if(position == 3){
                Log.e("position delivered", "I'm here")
            }
        } else {
            headerViewHolder.expandIcon.setImageResource(R.drawable.ic_expand_more_black_24dp)
        }

有人可以帮助我或提出解决方案吗?

【问题讨论】:

  • 要点 - 永远不要在任何滚动视图或嵌套滚动视图中使用 recyclerview。现在关于滚动,您可以使用recyclerView.scrollToPosition(items.size() - 1)
  • @MohitAjwani 我不能在适配器中使用它,已经尝试过了
  • 不,您不能在适配器内部使用它,您需要在 recyclerView 对象上执行它。它只能从您拥有实例的片段中使用 findViewById 或 kotlin 合成或任何东西来完成。您需要通过监听器给片段回调。
  • 刚刚添加了 recyclerView.addOnItemClickListener(object: OnItemClickListener{ override fun onItemClicked(position: Int, view: View) { recyclerView.scrollToPosition(adapter.itemCount - 1 ) } }) 适配器中的 onclicklistener 没有'不再工作了,现在无法展开我的项目
  • 您无法在 recyclerview 上添加项目。我们需要在标题点击时自定义监听器。将侦听器引用传递给适配器。在标题视图上 - 添加一个点击监听器。在其中使用传递给适配器的侦听器引用并调用回调函数。在传递侦听器的片段中,实现该函数并在其中添加 scrollToPosition 逻辑。

标签: android kotlin android-recyclerview adapter nestedscrollview


【解决方案1】:

您可以将侦听器连接到适配器并在需要时调用它,指示适配器内的单击位置:

class YourAdapter(val changeItemListener: (Int) -> Unit) : RecyclerView.Adapter<YourViewHolder>() {
    ...
    changeItemListener(position)
    ...
}

之后,您可以从 Activity 或 Fragment 创建带有监听器的适配器,并在监听器中调用 scrollToPosition 或任何您可能需要的东西。

viewModelAdapter = YourAdapter(changeItemListener = {position -> your_recyclerview.smoothScrollToPosition(position)})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多