SwipeRefreshLayout блокирует onClickCallback элемента во вложенном RecyclerView - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть SwipeRefreshLayout с вложенным RecyclerView. Каждый элемент в представлении рециркулятора по сути является CardView с прикрепленным onClickHandler. У меня есть проблема, когда мой clickHandler не вызывается, если представление рециркулятора прокручивается до самого верха. Если я прокручиваю один пиксель вниз, я могу щелкнуть мышью по вещам.

После добавления операторов распечатки о событиях касания и событиях щелчка кажется, что раскладка с изменением sh также будет перехватывать событие касания и setTargetOffsetTopAndBottom , Это вызывает requestLayout, что в конечном итоге приводит к событию ACTION_CANCEL. Если я прокручиваю вниз представление рециркулятора, 1px canChildScrollUp() вернет true и остановит вызов requestLayout с помощью SwipRefreshLayout.

// 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;
    ...

Layout

<?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.

1 Ответ

0 голосов
/ 20 марта 2020

У меня возникла та же проблема. У меня была ConstraintLayout упаковка SwipeRefreshLayout. Когда я удалил ConstraintLayout (заменил его на LinearLayout), проблема была исправлена. Надеюсь, это поможет. Я понятия не имею, почему это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...