android - 在 RecyclerView GridLayout 上滚动时如何选择项目?
问题描述
我试图实现像三星日历上那样的交互
我知道您必须使用触摸事件(我在 Android 文档中看到过),但我仍然无法进行该交互。
@Override
public void onLongClick(View view, int position) {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
}
解决方案
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);
}
}
这是我实现的监听器
推荐阅读
- git - 如何取消拆分以前在一个存储库中的两个 git 存储库?
- javascript - 如何使按钮从外部组件触发模式
- jenkins - jenkins - pm2 重新启动 jenkins 中的所有命令,而不是更新公共节点应用程序
- azure - Azure 上的条件访问
- javascript - 使用 AJAX 提交表单时处理 Firefox 中的无效字段
- graphql-js - 如何使用来自 apollo-boost 的 gql 返回不同的数据
- postgresql - 意外的标记::(冒号) 在 Hibernate
- flutter - Flutter:我无法使用谷歌登录库注销我的应用程序。这个怎么做?
- python - 将选项卡打印合并到具有生成打印的 id 的数据框中
- java - Java PreparedStatement:有什么方法可以使用索引或命名参数?