- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个实现 RecyclerView.OnItemTouchListener 的 fragment 。如何将 仅单击和长按运动事件 从 RecyclerView 传递到 GestureDetectorCompat。也就是说,我只想处理点击和长按,其余事件应该由 RecyclerView 正常处理。我该如何设置?
public class MyFragment extends Fragment implements RecyclerView.OnItemTouchListener,
GestureDetector.OnGestureListener {
protected RecyclerView recyclerView;
protected RecyclerView.Adapter adapter;
protected LinearLayoutManager layoutManager;
private GestureDetectorCompat detector;
public MyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.myfrag, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnItemTouchListener(this);
adapter = new MyAdapter(myData));
recyclerView.setAdapter(adapter);
return rootView;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {
}
}
最佳答案
您必须在 onCreateView()
方法中初始化 GestureDetectorCompat
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.myfrag, container, false);
detector = new GestureDetectorCompat(getActivity(), new RecyclerViewOnGestureListener());
recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnItemTouchListener(this);
adapter = new MyAdapter(myData));
recyclerView.setAdapter(adapter);
return rootView;
}
RecyclerViewOnGestureListener
是您自己的扩展 SimpleOnGestureListener
的内部类(它提供了 OnGestureListener
方法的空实现)
private class RecyclerViewOnGestureListener extends SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
int position = recyclerView.getChildPosition(view);
// handle single tap
return super.onSingleTapConfirmed(e);
}
public void onLongPress(MotionEvent e) {
View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
int position = recyclerView.getChildPosition(view);
// handle long press
super.onLongPress(e);
}
}
现在看行(来自 onCreateView()
方法):
recyclerView.addOnItemTouchListener(this);
在我们的例子中,“this”是 OnItemTouchListener
,其中包含我们需要实现的两个方法:
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
detector.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
这里解释一下这些方法的含义: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html
这就是处理来自 RecyclerView
的单击和长按事件所需的一切。
关于java - 将 MotionEvents 从 RecyclerView.OnItemTouchListener 传递到 GestureDetectorCompat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524003/
我想在代码中模拟一个触摸事件,换句话说,就是在屏幕上的扫动。 我想在我的代码中触发方法 public boolean onTouchEvent(MotionEvent event),但是 Motion
我正在编写一个需要响应触摸事件的 Android 应用程序。我希望我的应用程序将列表项的颜色更改为自定义颜色。我编写了以下代码,但只有 MotionEvent.ACTION_DOWN 部分有效。 Lo
我想知道 MotionEvent.getRawX 和 MotionEvent.getX 在android中的区别,一个是数字,另一个是 float ?两者都需要什么这些类型? 最佳答案 => rawX
有谁知道为什么我的日志显示没有调用 onTouch(View, MotionEvent)。我可以看到正在调用 onTouchEvent(MotionEvent event)。两者都在实现 View.O
PhotoViewAttacher的boolean onFling(MotionEvent, MotionEvent, float, float)阻止我的OnSingleFlingListener的o
ImageView ii = (ImageView)v.findViewById(R.id.picture); ii.setOnTouchListener(new OnTouchListener()
我正在制作一个应用程序,我想使用自定义按钮皮肤。我用于在按下按钮时更改背景的代码如下: button3.setOnTouchListener(new OnTouchListener() {
我正在尝试在 canvas 上画一个正方形但只有 MotionEvent.ACTION_DOWN运行,然后listener停止。 这个想法是,当用户触摸屏幕时,它会获取 x1 和 y1 位置,并且每次
我正在使用 SurfaceView 将触摸绘制为覆盖在我的应用程序上。我希望我的其他 View 能够与 SurfaceView 同时响应触摸事件,因此在包含的 ViewGroup 中他们都是我添加的
我正在为 Android 开发游戏并使用以下方法将在 View 上捕获的 MotionEvents 传递给游戏进行处理。 @Override public boolean onTouchEvent(M
我目前正在为 Android 上的多点触摸事件实现手势检测器。为了测试检测器的行为,我想将 MotionEvents 发送到检测器并检查他的 Action 。 我目前遇到的问题是我只能通过调用现有的
在 OnTouchEvent 中,如果您通过不同的触摸 Action 切换 switch (e.getAction),它处理 ACTION_DOWN 和 ACTION_MOVE,但由于某种原因它没有捕
我正在寻找是否可以在键盘上(在我的应用程序中)捕获 MotionEven 数据(压力)?或者有没有办法在我的应用程序中拦截屏幕上的所有触摸(类似于全屏模式)。 最佳答案 试一试: @
故事是这样的: 我正在尝试在 Android Studio 中构建猜谜游戏。用户必须猜测一个介于 0 和 1000 之间的数字。每次用户猜测时,计算机都会告诉您猜测是小于实际数字(冷)还是大于实际数字
一开始我的英语不是很好,所以请原谅我的错误。 我制作了一个简单的应用程序,它将一个白色圆圈从起始位置 (100,100) 移动到有限 RelativeLayout (200x200) 中的任何其他位置
MotionEvent 没有构造函数,我想在我的单元测试中手动创建一个 MotionEvent,那么如何获得呢?谢谢。 最佳答案 您应该使用 MotionEvent 类的静态 obtain 方法之一来
这是我的第一个主题here的继续,该主题是有关如何使用代码模拟屏幕触摸的。 我想将此功能整合到 float 的屏幕聊天头中(就像facebook所做的那样)。因此,基本上,当我点击聊天头时,此服务将模
您好,我正在制作一个 Android 应用程序,它使用地理位置/Google map ,除了选项卡主机之外, map /应用程序上没有任何按钮。所以我需要它,所以如果用户点击 1500 毫秒,就会出现
我的 OnSwipeImageListener 有问题(实现 OnTouchListener)。我在两个 Activity 中使用 OnSwipeImageListener。 ImageView 上的
我有以下代码 fragment (来自此聊天头 tutorial ),最后一个 switch case 的要点是处理 View 上的拖动,但是我无法不理解这个逻辑是如何运作的: ...
我是一名优秀的程序员,十分优秀!