我正在尝试实现一个允许滑动和单击按钮的自定义列表视图,类似于回旋镖电子邮件客户端已实现的实现(或适用于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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)