簡體   English   中英

如何點擊回收站視圖?

[英]How to click through a recyclerview?

首先,我在這個問題上掙扎了很長時間。 我不知道如何解決問題,所以我沒有走運就按照這些步驟和教程進行操作。

  1. 點擊回收站查看空白空間
  2. 單擊回收者視圖列表項

和一堆關於 StackOverflow 的問題。 我也寫了自己的代碼。 可能是我在做一些愚蠢的事情,但無法弄清楚。

mRecyclerView.setOnTouchListener((v, event) -> {
    RectF rectf = new RectF((int) event.getX(), 
                            (int) event.getY(), 
                            0, 0);
    boolean contains = getCenter(mHeaderPopUp).contains(rectf);
    if (contains) {
        Toast.makeText(mContext, "Clicked", Toast.LENGTH_SHORT).show();
    }
    return false;
});

private RectF getCenter(View view) {
    Rect rect = new Rect();
    view.getLocalVisibleRect(rect);
    RectF dimens = new RectF((rect.left + rect.width() / 2), 
                             (int) (rect.top + rect.height() / 2),
                             0, 0);
    return dimens;
}

所以現在我已經嘗試了所有這些東西,但我無法點擊 recyclerview 到 recyclerview 下方的視圖,您可以在下圖中看到。 recyclerview 覆蓋了屏幕上的所有視圖,我需要將點擊傳遞到下面的 recyclerview 我不想將這些視圖放在 recyclerview 上方,因為當您滾動 recyclerview 時,它會被動畫化並覆蓋所有視圖及其項目。 提前致謝。 這是圖像

我想我找到了。

使用recycler.setLayoutFrozen(true);

您仍然可以將 onClickListeners 分配給您的項目,但如果您不這樣做,點擊將通過。

RecyclerView.java的源代碼:

@Override
public boolean onTouchEvent(MotionEvent e) {
    if (mLayoutFrozen || mIgnoreMotionEventTillDown) {
        return false; // <= This will prevent the RecyclerView from getting the MotionEvent
    }
...
}

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java#2795

你好,我找到了答案。 我在 RecyclerView 下方有卡片,recyclerView 從左邊開始填充,我設置了 clipToFading=false。 為了使 recyclerView 下方的卡片可點擊,我創建了 RecyclerTouch 事件類,當點擊 childView 為 null 時,這意味着它在 childs 和開放空間之外,我給我的卡片提供了觸摸事件。 這是代碼

public class RecyclerTouchEvent implements RecyclerView.OnItemTouchListener {
    private GestureDetector gestureDetector;
    ClickListener clickListener;

    public RecyclerTouchEvent(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {

                return super.onSingleTapUp(e);
            }

            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
            }

        });

    }

    @Override
    public boolean onInterceptTouchEvent(final RecyclerView rv, MotionEvent e) {
        final View childView = rv.findChildViewUnder(e.getX(), e.getY());


        if (childView != null && clickListener != null) {
            clickListener.onClick(childView);
        }else if (childView==null&&clickListener!=null){
            clickListener.onOutsideClick(e);
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent motionEvent) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

public static interface ClickListener {
    public void onClick(View view);
    public void onOutsideClick(MotionEvent event);
}

recyclerViewLends.addOnItemTouchListener(new RecyclerTouchEvent(getContext(), recyclerViewLends, new ClickListener() {
            @Override
            public void onClick(View view) {

            }

            @Override
            public void onOutsideClick(MotionEvent e) {
                rippleLayoutAddLend.dispatchTouchEvent(e);
            }
        }));

rippleLayoutAddLend 是 recyclerView 下的一個視圖,必須點擊

當我的RecyclerView標題項完全透明並且需要在其后面單擊時,我遇到了情況。

內部Activity功能:

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean

我調用擴展函數RecyclerView.suppressOnHeader

/**
 * If [onView] returns true -> it means what need skip this touch action for [RecyclerView]:
 * - Set true for [RecyclerView.suppressLayout], that makes list not scrollable and 
 *   transparent for clicking.
 *
 * If [onView] returns false -> it means what need vice versa make [RecyclerView] 
 * scrollable  and not transparent for clicking:
 * - Set false for [RecyclerView.suppressLayout], turn on touch events and scrolling for list.
 * - Need call [RecyclerView.onInterceptTouchEvent], this need for reset key
 *   [RecyclerView.mIgnoreMotionEventTillDown], which was setup when we call
 *   [RecyclerView.suppressLayout]. If skip this step when first [RecyclerView] click
 *   will be ignored. For information see [RecyclerView.onTouchEvent].
 * - And in the end call [RecyclerView.onTouchEvent], like we make a touch event.
 */
fun RecyclerView.suppressOnHeader(ev: MotionEvent?) {
    if (ev?.action != MotionEvent.ACTION_DOWN) return

    val holderView = findViewHolderForAdapterPosition(0)?.itemView

    if (ev.onView(holderView)) {
        if (!isLayoutSuppressed) {
           suppressLayout(true)
        }
    } else {
        if (isLayoutSuppressed) {
            suppressLayout(false)
            onInterceptTouchEvent(ev)
            onTouchEvent(ev)
        }
    }
}

fun MotionEvent?.onView(view: View?): Boolean {
    if (view == null || this == null) return false

    return Rect().apply {
        view.getGlobalVisibleRect(this)
    }.contains(rawX.toInt(), rawY.toInt())
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM