У меня есть 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.