【发布时间】:2020-02-23 18:48:13
【问题描述】:
我有一个带有嵌套 RecyclerView 的 SwipeRefreshLayout。回收站视图中的每个项目本质上都是一个附加了 onClickHandler 的 CardView。我有一个问题,如果回收站视图滚动到最顶部,我的 clickHandler 不会被调用。如果我向下滚动 1 px,我可以点击一些东西。
在触摸事件和点击事件上添加打印输出语句后,滑动刷新布局似乎也会拦截触摸事件和setTargetOffsetTopAndBottom。这会调用requestLayout,最终似乎会导致ACTION_CANCEL 事件。如果我向下滚动回收站视图 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>
ViewHolder
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。
【问题讨论】:
标签: android android-recyclerview onclick swiperefreshlayout