当前位置: 首页 > 面试题库 >

从RecyclerView.OnItemTouchListener传递MotionEvents到GestureDetectorCompat

黄昊英
2023-03-14
问题内容

我有一个实现RecyclerView.OnItemTouchListener的片段。如何 将ReclickerView
事件和单击和Long-click运动事件
传递给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) {

    }
}

问题答案:

您必须GestureDetectorCompatonCreateView()方法中进行初始化:

@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



 类似资料:
  • 问题内容: 由于这是我的第一篇文章,请原谅任何不正确之处。我的问题,我想将JavaScript函数的值传递给initialize方法的Javafx } 和JavaScript部分是这样的 我要传递的值是方法调用JavaScript上的lengthInMeters有什么想法?提前thnx 问题答案: 我已经尝试过简化代码: 而且不起作用。 在您的情况下和在我的方法中,是 在* 网络加载 后 调用的,

  • 问题内容: 我有一个接受回调的C ++函数,如下所示: 我想通过给它一个闭包从Cython调用此函数,即,如果我从C ++调用它,我会用lambda来完成。如果这是一个C函数,它将有一些额外的参数: 然后我只想通过的(有更详细的在这里例子)。 有没有办法以C ++的方式做更多的事情,而不必诉诸显式的? 问题答案: 我相信您的目标是将可调用的Python对象传递给接受的对象。您需要创建一些C ++代

  • 我正在尝试将包含object的ArrayList从servlet传递到JSP。但是 Servlet文件: JSP文件:

  • 我正在尝试将某些值从servlet传递到JSP页面,并添加已传递到标记的值,阅读了许多文章,我得到了以下代码。 使用输入页面选择文件 验证上传的文件 调用上传。java将上传的文件保存在WEB-INF中 在上载的文件中,选定的文件保存为“我的”。txt 使用缓冲区读取文件内容并将其保存到变量 将其传递到JSP页面 上载JAVA 上传文件后, mypage.jsp 现在,当我点击上传按钮完成所有这些

  • 问题内容: 当我尝试将Servlet中的列表值设置为会话变量并像JSP一样访问它时, 做得到 JSP 我在JSP中遇到错误,因为“列表无法解析为类型” 那我该怎么做呢?我想将列表从Servlet传递到JSP并填充一个下拉列表。 问题答案: 您要导入列表和演员表吗?

  • 问题内容: 我想将值传递给javascript。如果可能的话,我该怎么办?如何在后备bean中接收它们? 问题答案: