【问题标题】:How to select items when scrolling on RecyclerView GridLayout?在 RecyclerView GridLayout 上滚动时如何选择项目?
【发布时间】:2019-12-12 20:23:15
【问题描述】:

我已尝试实现类似于三星日历上的交互

samsung calendar app

我知道您必须使用触摸事件(我在 Android 文档中看到过),但我仍然无法进行该交互。

@Override
public void onLongClick(View view, int position) {                 
  view.setOnTouchListener(new View.OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {
       return false;
     }
   });
} 

【问题讨论】:

  • 你在哪里设置了这个回调?您能否提供更多代码,至少是围绕上述代码的代码以及您在此处处理的类/视图?这可以帮助我们提供一些帮助。
  • 对不起,我在底部答案中添加了我的代码。

标签: android android-recyclerview scroll


【解决方案1】:
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;

public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
    this.clickListener = clickListener;
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null) {
                clickListener.onLongClick(child, recyclerView.getChildPosition(child));
            }
        }

        @Override
        public boolean onDown(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null) {
                clickListener.onDown(child, recyclerView.getChildPosition(child), e);
            }
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return super.onScroll(e1, e2, distanceX, distanceY);
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
        clickListener.onClick(child, rv.getChildPosition(child));
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null) {
        clickListener.onTouchEvent(rv, e, rv.getChildPosition(child));
    }

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

public interface ClickListener {
    void onClick(View view, int position);

    void onLongClick(View view, int position);

    void onTouchEvent(RecyclerView rv, MotionEvent e, int childPosition);

    void onDown(View view, int position, MotionEvent e);

}

}

这是我实现的监听器

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多