android–ListView上的SwipeListener和ListView项目上的ClickListener

android–ListView上的SwipeListener和ListView项目上的ClickListener,第1张

概述这是我的oldquestion.不过这次我也提供了我的代码.我有一个包含不同类型行的ListView.该行可能包含文本,图像,视频或其他内容.如果我点击ImageView(在行内)我将转到另一个活动以全屏显示图像,如果我点击视频(在行内)我将去另一个活动播放他的视频.我在ListView上实现了从右到左

这是我的old question.不过这次我也提供了我的代码.

我有一个包含不同类型行的ListVIEw.该行可能包含文本,图像,视频或其他内容.如果我点击ImageVIEw(在行内)我将转到另一个活动以全屏显示图像,如果我点击视频(在行内)我将去另一个活动播放他的视频.

我在ListVIEw上实现了从右到左的滑动侦听器.如果我从ListVIEw中的空白区域启动ListVIEw滑动,则滑动工作(下图中的第一行和第二行).但是,如果我从ListVIEw行的项目开始ListVIEw滑动,则滑动不起作用(下图中的第三和第四行).如果我从ImageVIEw和VIDeo中删除了单击事件,那么即使我从ListVIEw行的项目开始滑动,滑动也会起作用,即在这种情况下,滑动在整个ListVIEw上工作,无论我在哪一行进行滑动.

我该怎样摆脱这个问题?我想如果我禁用ListVIEw中所有项目的所有点击事件,就可以实现这一点.怎么会这样?还有其他方法吗?

我想要在ListVIEw上滑动并单击ListVIEw的项目.

SwipeDetector.java – 用于检测ListVIEw上的滑动

public class SwipeDetector implements VIEw.OntouchListener {private SwipeListener swipeListener;private ListVIEw mListVIEw;private int hundred;private boolean motionInterceptdisallowed = false;public static enum Action {    LR, // left to right    RL, // Right to left    TB, // top to bottom    BT, // Bottom to top    None // Action not found}private static final int HORIZONTAL_MIN_disTANCE = 30; // The minimum// distance for// horizontal swipeprivate static final int VERTICAL_MIN_disTANCE = 80; // The minimum distance// for vertical// swipeprivate float downX, downY, upX, upY; // Coordinatesprivate Action mSwipeDetected = Action.None; // Last actionpublic SwipeDetector(Context context, ListVIEw ListVIEw) {    hundred = (int) context.getResources().getDimension(R.dimen.hundred);    mListVIEw = ListVIEw;}public boolean swipeDetected() {    return mSwipeDetected != Action.None;}public Action getAction() {    return mSwipeDetected;}/** * Swipe detection */@OverrIDepublic boolean ontouch(VIEw v, MotionEvent event) {    switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:        {            downX = event.getX();            downY = event.getY();            mSwipeDetected = Action.None;            return false; // allow other events like Click to be processed        }        case MotionEvent.ACTION_MOVE:        {            upX = event.getX();            upY = event.getY();            float deltaX = downX - upX;            float deltaY = downY - upY;            float absX = Math.abs(deltaX);            float absY = Math.abs(deltaY);            if((absX >= (3 * absY)) && absX > HORIZONTAL_MIN_disTANCE && mListVIEw != null && !motionInterceptdisallowed) {                mListVIEw.requestdisallowIntercepttouchEvent(true);                motionInterceptdisallowed = true;            }            if((absX >= (3 * absY)) && absX <= hundred) {                if (deltaX > 0) {                    mSwipeDetected = Action.RL;                    swipeListener.onSwipe(MotionEvent.ACTION_MOVE, Action.RL, absX);                }            }            return false;        }        case MotionEvent.ACTION_UP:            swipeListener.onSwipe(MotionEvent.ACTION_UP, Action.BT, 0);            if (mListVIEw != null) {                mListVIEw.requestdisallowIntercepttouchEvent(false);                motionInterceptdisallowed = false;            }            return false;        case MotionEvent.ACTION_CANCEL:            return true;    }    return false;}/** * Set chat send Listener * @param Listener */public voID setSwipeListener(SwipeListener Listener) {    swipeListener = Listener;}public interface SwipeListener {    voID onSwipe(int event, Action action, float x);}}

这就是我在ListVIEw上设置SwipeDetector的方法

final SwipeDetector swipeDetector = new SwipeDetector(SwipeActivity.this, mListVIEw);    swipeDetector.setSwipeListener(mSwipeListener);    mListVIEw.setontouchListener(swipeDetector);

我的Activity实现了SwipeDetector.SwipeListener

以下是onSwipe()方法的重写

@OverrIDepublic voID onSwipe(int event, SwipeDetector.Action action, float x) {    switch (event) {            case MotionEvent.ACTION_MOVE:                System.out.println("List move");                break;            case MotionEvent.ACTION_UP:                System.out.println("List up");                break;        }}

在我的适配器中,我在TextVIEw,ImageVIEw和VIDeoVIEw上设置onClickListener()

holder.mTextVIEw.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            System.out.println("item textvIEw click");        }    });holder.mImageVIEw.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            System.out.println("item imagevIEw click");        }    });holder.mVIDeoVIEw.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            System.out.println("item vIDeovIEw click");        }    });

当我从ListVIEw的空白区域开始滑动时,ListVIEw的滑动侦听器会捕获它.但是,当我从TextVIEw / ImageVIEw / VIDeoVIEw开始滑动时,会触发VIEw的onClickListener,而不是父类(ListVIEw的)ontouchListener().

我该如何实现呢?我希望当我点击ListVIEw的项目时,该项目的onClick应该被触发,当我在ListVIEw的项目上滑动时,ListVIEw的onSwipe应该被触发.

解决方法:

这对于Listitem的onClickListener和List的SwipeListener都不可能,因为它会在触摸时考虑VIEw之间产生歧义

您使用OnSwipetouchListener实现ontouchListener

OnSwipetouchListener.java

import androID.vIEw.GestureDetector;import androID.vIEw.GestureDetector.SimpleOnGestureListener;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OntouchListener;public class OnSwipetouchListener implements OntouchListener {    private final GestureDetector gestureDetector;    public OnSwipetouchListener (Context ctx){        gestureDetector = new GestureDetector(ctx, new GestureListener());    }    private final class GestureListener extends SimpleOnGestureListener {        private static final int SWIPE_THRESHolD = 100;        private static final int SWIPE_VELociTY_THRESHolD = 100;        @OverrIDe        public boolean onDown(MotionEvent e) {            return true;        }        @OverrIDe        public boolean onFling(MotionEvent e1, MotionEvent e2, float veLocityX, float veLocityY) {            boolean result = false;            try {                float diffY = e2.getY() - e1.getY();                float diffX = e2.getX() - e1.getX();                if (Math.abs(diffX) > Math.abs(diffY)) {                    if (Math.abs(diffX) > SWIPE_THRESHolD && Math.abs(veLocityX) > SWIPE_VELociTY_THRESHolD) {                        if (diffX > 0) {                            onSwipeRight();                        } else {                            onSwipeleft();                        }                    }                    result = true;                }                 else if (Math.abs(diffY) > SWIPE_THRESHolD && Math.abs(veLocityY) > SWIPE_VELociTY_THRESHolD) {                        if (diffY > 0) {                            onSwipeBottom();                        } else {                            onSwipetop();                        }                    }                    result = true;            } catch (Exception exception) {                exception.printstacktrace();            }            return result;        }    }    public voID onSwipeRight() {    }    public voID onSwipeleft() {    }    public voID onSwipetop() {    }    public voID onSwipeBottom() {    }}

并在Listitem上使用OnSwipetouchListener

  Listitem.setontouchListener(new OnSwipetouchListener() {        public voID onSwipeleft() {            //stuff to do List vIEw left swipe             Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();        }        public boolean ontouch(VIEw v, MotionEvent event) {            //stuff to do on List item click            return gestureDetector.ontouchEvent(event);        }    });}); //to get click events 
总结

以上是内存溢出为你收集整理的android – ListView上的SwipeListener和ListView项目上的ClickListener全部内容,希望文章能够帮你解决android – ListView上的SwipeListener和ListView项目上的ClickListener所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1117224.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存