我有Activity
,里面是ViewPager
,里面是ListFragment
,内容ListView
。我想为物品定义触摸手势(拖动,拖拽等)。
我可以通过覆盖ListView
适配器将onTouchListener()
附加到每个View
项getView()
。
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_DOWN
,MotionEvent.ACTION_MOVE
和MotionEvent.ACTION_UP
。例如,我无法抓住MotionEvent.ACTION_OUTSIDE
。
我的猜测是,我的自定义onTouchListener
与ViewPager
和Activity
的听众竞争。我想在某些情况下触发这些其他听众,即如果用户移到一边,我想在View
内滑动整个ViewPager
但是如果他按下ListView
项并垂直移动,我想要startDrag()
项目。
如何实现?
修改/ 目前,ListView
项目上的自定义侦听器与ViewPager
一起使用,这很棒。只要我不移动到ListView
之外,我就可以捕获View
项目事件,并且我可以在View
中滑动整个ViewPager
{1}}也是。
编辑/ 我已将ListView
重写为RecycledView
,并意识到如果我将监听器附加到项目View
,{{1}捕获几乎所有移动事件,同时仅允许点击事件通过。我也意识到,如果我将ViewPager
附加到OnTouchListener
,那么 能够跟踪RecycledList
移动事件,因此它取决于我附加ViewPager
的级别。问题是,在项目Listener
级别中我可以完全引用项目,而在使用列表时,我需要从事件坐标中猜测项目位置,然后从Adapter和View
收集数据,是额外的工作。
编辑/ 毕竟它并不难。幸运的是,RecycledView
有RecycledView
方法,所以让findChildViewUnder(int xPos, int yPos)
变得轻而易举。
这是我的实施,如果有人有兴趣
View
答案 0 :(得分:2)
我建议您将ListView
替换为RecyclerView
。然后阅读this tutorial:它包含了RecyclerView
上几乎所有拖动/滑动/触摸实现的清晰解释。