组合多个onTouchListeners()

时间:2015-12-29 09:13:31

标签: android listview ontouchlistener

我有Activity,里面是ViewPager,里面是ListFragment,内容ListView。我想为物品定义触摸手势(拖动,拖拽等)。

我可以通过覆盖ListView适配器将onTouchListener()附加到每个ViewgetView()

Adapter adapter = new Adapter(blah, blah, blah) {
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View itemView = super.getView(position, convertView, parent);
            itemView.setOnTouchListener(new View.OnTouchListener() {
                blah, blah, blah
            });
            return itemView;
        }
     };

但是,如果它发生在触发项View边界内,我只会收到MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_UP。例如,我无法抓住MotionEvent.ACTION_OUTSIDE

我的猜测是,我的自定义onTouchListenerViewPagerActivity的听众竞争。我想在某些情况下触发这些其他听众,即如果用户移到一边,我想在View内滑动整个ViewPager但是如果他按下ListView项并垂直移动,我想要startDrag()项目。

如何实现?

修改/ 目前,ListView项目上的自定义侦听器与ViewPager一起使用,这很棒。只要我不移动到ListView之外,我就可以捕获View项目事件,并且我可以在View中滑动整个ViewPager {1}}也是。

编辑/ 我已将ListView重写为RecycledView,并意识到如果我将监听器附加到项目View,{{1}捕获几乎所有移动事件,同时仅允许点击事件通过。我也意识到,如果我将ViewPager附加到OnTouchListener,那么 能够跟踪RecycledList移动事件,因此它取决于我附加ViewPager的级别。问题是,在项目Listener级别中我可以完全引用项目,而在使用列表时,我需要从事件坐标中猜测项目位置,然后从Adapter和View收集数据,是额外的工作。

编辑/ 毕竟它并不难。幸运的是,RecycledViewRecycledView方法,所以让findChildViewUnder(int xPos, int yPos)变得轻而易举。

这是我的实施,如果有人有兴趣

View

1 个答案:

答案 0 :(得分:2)

我建议您将ListView替换为RecyclerView。然后阅读this tutorial:它包含了RecyclerView上几乎所有拖动/滑动/触摸实现的清晰解释。