为了账号安全,请及时绑定邮箱和手机立即绑定

仅当 RecyclerView 可滚动时,如何向 RecyclerView 中的最后一个

仅当 RecyclerView 可滚动时,如何向 RecyclerView 中的最后一个

慕标5832272 2021-10-17 16:59:17
我想底部填充添加到最后一个视图中RecyclerView,但只有当RecyclerView是滚动的-换句话说,如果最后一个适配器产品,没有滚动完全可见,不添加填充。我意识到从 onBindViewHolder 中,findLastCompletelyVisibleItemPosition()将始终返回前一项的位置,因为当前视图在技术上尚不可见。我也尝试了 ItemDecorator 但这也不起作用,因为它们是在视图之前添加的,所以我们仍然不知道 RecyclerView 是否可滚动。我的理想方法如下所示:@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {    ...    if (position == items.size() - 1 && [is scrollable]) {        ((MyViewHolder) viewHolder).addBottomPadding(...);    }}那[可滚动]位是我不确定的。有没有另一种方法来实现这一点?
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

好的,所以我为您提供了一个解决方案:)。核心概念是将 附加viewTreeObserver OnGlobalLayoutListener到onBind. 然后在OnGlobalLayout测量视图后调用它的方法,这对您的要求至关重要。一旦被调用,只需计算y + itemViewHeight并将其与height of the RecyclerView. 要获得此高度,您还必须将 附加OnGlobalLayoutListener到 RecyclerView,然后设置Adapter with the height of it as parameter. 您可能需要在调用 onGobalLayout 之前设置一个“空”适配器以防止错误。


要记住两件重要的事情:


- 永远不要忘记删除 OnGlobalLayoutListener

- 下面的代码很丑陋,只是一个最小的可行产品


活动:


class MainActivity : AppCompatActivity() {


override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main)

    rvTest.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

    //maybe an adapter without content has to be provided so you won't get the error: no adapter attached skipping layout

    rvTest.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {

        override fun onGlobalLayout() {

            rvTest.adapter = RvTestAdapter(this@MainActivity, rvTest.height)

            rvTest.viewTreeObserver.removeOnGlobalLayoutListener(this) //must remove! 

        }


    })

}

}

适配器:


class RvTestAdapter(val context: Context, val recyclerViewHeight: Int): RecyclerView.Adapter<TestViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = TestViewHolder(LayoutInflater.from(context).inflate(R.layout.vh_test, parent, false))


    override fun getItemCount() = 3


    override fun onBindViewHolder(holder: TestViewHolder, position: Int) {

        if (position == 2) { //last position

            holder.itemView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {

                override fun onGlobalLayout() {

                    if (holder.itemView.y + holder.itemView.height  > recyclerViewHeight) {

                        Log.d("YESSSS", "WOOP WOOP")

                    }


                    holder.itemView.viewTreeObserver.removeOnGlobalLayoutListener(this)

                }


            })

        }

    }


}

(希望你不介意 Kotlin 代码)


查看完整回答
反对 回复 2021-10-17
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

将android:clipToPadding属性添加到您的视图,并为您的视图提供填充,该视图将随 recylerview 项目滚动。


  <android.support.v7.widget.RecyclerView

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:clipToPadding="false"

        android:paddingBottom="16dp"

        android:paddingTop="16dp"

     />

希望这会有所帮助


查看完整回答
反对 回复 2021-10-17
  • 2 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信