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

android– 在不消耗触摸事件的情况下实现listItem onClickListener,第1张

概述我正在尝试实现一个允许滑动和单击按钮的自定义列表视图,类似于回旋镖电子邮件客户端已实现的实现(或适用于iOS的Mailbox).如果我只想单击列表项本身,我可以创建一个新的OnItemClickListener,并确保没有可聚焦或可点击的后代,这些后代不会消耗触摸事件,并允许自定义列表视图检测滑

我正在尝试实现一个允许滑动和单击按钮的自定义列表视图,类似于回旋镖电子邮件客户端已实现的实现(或适用于iOS的MailBox).

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

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

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

这是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;         }    };

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

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中的布局代码段:

<?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检测器和一个可用于回调父类的自定义接口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.      }}

和,一个自定义垂直滚动视图类,捕获向下滑动,但将所有其他手势传递给孩子.

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);}@OverrIDepublic 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全部内容,希望文章能够帮你解决android – 在不消耗触摸事件的情况下实现listItem onClickListener所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107215.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存