gpt4 book ai didi

android - SwipeRefreshLayout 阻止嵌套 RecyclerView 中项目的 onClickCallback

转载 作者:行者123 更新时间:2023-12-04 23:56:34 25 4
gpt4 key购买 nike

我有一个带有嵌套 RecyclerView 的 SwipeRefreshLayout。回收站 View 中的每个项目本质上都是一个附加了 onClickHandler 的 CardView。我有一个问题,如果回收器 View 滚动到最顶部,我的 clickHandler 不会被调用。如果我向下滚动一个像素,我就可以点击内容。

在触摸事件和点击事件上添加打印输出语句后,滑动刷新布局似乎也会拦截触摸事件和setTargetOffsetTopAndBottom。这会调用 requestLayout,最终似乎会导致 ACTION_CANCEL 事件。如果我向下滚动回收器 View 1px canChildScrollUp() 将返回 true 并停止 SwipRefreshLayout 调用的 requestLayout

// SwipeRefreshLayout.java
public boolean onInterceptTouchEvent(MotionEvent ev) {
...
if (!isEnabled() || mReturningToStart || canChildScrollUp()
|| mRefreshing || mNestedScrollInProgress) {
// Fail fast if we're not in a state where a swipe is possible
return false;
}
...
switch (action) {
case MotionEvent.ACTION_DOWN:
setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCircleView.getTop());
mActivePointerId = ev.getPointerId(0);
mIsBeingDragged = false;

pointerIndex = ev.findPointerIndex(mActivePointerId);
if (pointerIndex < 0) {
return false;
}
mInitialDownY = ev.getY(pointerIndex);
break;
...

布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ticket_wallet_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/ticket_wallet_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:itemCount="3"
tools:listheader="@layout/ticket_header_item"
tools:listitem="@layout/active_ticket_item" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View 持有者

sealed class FooViewHolder(view: View) : RecyclerView.ViewHolder(view) {

abstract fun bind(item: WalletItem)

class ActiveFooViewHolder(
view: View,
private val remainingTimeFormatter: RemainingTimeFormatter,
private val callback: (Int) -> Unit
) : FooViewHolder(view) {

init {
view.setOnClickListener {
callback(adapterPosition)
}
...

我的编译目标是 Android API lvl 29。

最佳答案

我也遇到了同样的问题。我确实有一个 ConstraintLayout 包装了 SwipeRefreshLayout。当我删除 ConstraintLayout(将其替换为 LinearLayout)时,问题得到解决。希望有所帮助。我不知道它为什么起作用。

关于android - SwipeRefreshLayout 阻止嵌套 RecyclerView 中项目的 onClickCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com