项内单击侦听器中的Android on touch侦听器

问题描述

我有一个包含项目的列表视图,每次单击“列表项”时,我都需要知道是否触摸了屏幕的左侧或右侧。为了完成此任务,我编写了以下代码

 testListView.setonItemClickListener(((parent,view,position,id) -> {

        view.setonTouchListener(new View.OnTouchListener() {
            private long startClickTime = 0;
            @Override
            public boolean onTouch(View view,MotionEvent motionEvent) {

                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

                    startClickTime = System.currentTimeMillis();

                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

                    if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {

                        displayMetrics displayMetrics = context.getResources().getdisplayMetrics();
                        float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
                        float leftPersentage = (dpWidth) * 100 / 100;
                        int x = (int) motionEvent.getX();
                        if (x < leftPersentage) {
                            Toast.makeText(context,"I have touched the left side of screen",Toast.LENGTH_SHORT);
                        } else {
                            Toast.makeText(context,"I have touched the right side of screen",Toast.LENGTH_SHORT);
                        }
                    }
                }
                return true;
            }
        });
    }));

这可行,但是,为了使Toast出现,我需要按两次List元素,并且我认为这是因为我第一次单击列表项元素,它注册了OnTouchListener,然后,如果我再次单击,它将启动。

如何解决这种奇怪的行为,以便仅需单击一下即可触发触摸式监听器?

解决方法

您需要在getView函数而不是setOnItemClickListener的ListView适配器上设置setOnTouchListener。