gpt4 book ai didi

android - 在不消耗触摸事件的情况下实现 listItem onClickListener

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:35 25 4
gpt4 key购买 nike

我正在尝试实现一个允许滑动和单击按钮的自定义 ListView ,类似于 boomerang 电子邮件客户端(或 iOS 邮箱)实现的实现。

如果我只想点击列表项本身,我可以创建一个新的 OnItemClickListener 并确保没有可聚焦或可点击的后代,这不会消耗触摸事件,并允许自定义 ListView 检测滑动。但是,如果我使列表项中的任何内容可点击,它将消耗触摸事件,而不是调用 OnItemClickListener,并禁用自定义列表本身的滑动功能。

我尝试过创建 onTouchListener 的自定义实现,或者对自定义 View 组使用 onInterceptTouchEvent。对于所有这些实现,onTouchListener 必须在 Action.DOWN 上返回 true(并因此消耗触摸事件),否则它将停止监听触摸事件的其余部分。

为什么 OnItemClickListener 可以在不消耗触摸事件的情况下检测到触摸,我如何为我自己的自定义实现复制它?任何帮助或指点表示赞赏!

Boomerang swipable and clickable list functionality

这是有效但不消耗触摸事件的 OnItemClickListener:

 private AdapterView.OnItemClickListener onClick = new AdapterView.OnItemClickListener() 
{
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int position,
long arg3) {

mAction = mAdapter.getItem(position);
updateListToShowCurrentAction();
return;
}
};

这是我希望能够为列表项中的 View 实现的功能,同时仍然将触摸事件传递到自定义 ListView :

cancelButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
final int position = mListView.getPositionForView((View) v.getParent());
mReordCtrl.removeAction(mAdapter, position);
}
});

这是 list_item 中的布局 fragment :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="list_item" >

<LinearLayout
android:id="@+id/back"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:tag="back" >

<ImageView
android:id="@+id/cancel_button"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:src="@drawable/ic_action_cancel"
android:tag="cancel_button" />
</LinearLayout>

最佳答案

如果您已经使用过 onInterceptTouchEvent,请尝试覆盖 onTouchEvent(MotionEvent e)。这是一个您可以根据需要进行调整的示例实现,它集成了一个 SimpleOnGestureListener 检测器和一个可用于回调父类的自定义接口(interface) viewListener。如果您只想检测点击,您可能不需要所有这些;您也许可以摆脱手势检测器。另外,这是一个 link我在研究触摸事件处理时发现很有用。

@Override public boolean onTouchEvent(MotionEvent ev) {
//See if the gesture detector has detected an event.
boolean eventConsumed = detector.onTouchEvent(ev);
if (!eventConsumed) {

//If no gesture detected, and the motion is finished, do something
if (ev.getAction() == MotionEvent.ACTION_UP) {
//DO SOMETHING, such as scroll

//Send event to listener.
if (viewListener != null) {
this.viewListener.onUp(ev.getX());
}
return true; //Consume the event, so nothing else fires.
} else {
//If no event is detected, and the action hasn't finished, do the default behavior
return super.onTouchEvent(ev);
}
} else {
return true; //Consume the event, so nothing else fires. You can change this to false if you'd like to not consume the event.
}

}

还有一个自定义的垂直 ScrollView 类,它捕获向下滑动,但将所有其他手势传递给 child 。

public class VerticalScrollView extends ScrollView {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;

public VerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean superBool = super.onInterceptTouchEvent(ev);
boolean intercept = mGestureDetector.onTouchEvent(ev);
return superBool && intercept ;
}

// Return false if we're scrolling more in the x direction than in the y direction, so we don't claim the action.
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceY) > Math.abs(distanceX);
}
}

关于android - 在不消耗触摸事件的情况下实现 listItem onClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com