[英]How to click through a recyclerview?
首先,我在這個問題上掙扎了很長時間。 我不知道如何解決問題,所以我沒有走運就按照這些步驟和教程進行操作。
和一堆關於 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
}
...
}
你好,我找到了答案。 我在 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.