- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想弄清楚实现两个列表的最佳方式是什么,父列表可以垂直滑动,子列表可以水平滑动。假定父列表是一个无限列表,而子列表最多可以有 n 页。RecyclerView 似乎是这项工作的最佳工具,并且考虑到添加了 PagerSnapHelper,重新创建页面滑动行为真的很容易(想想 ViewPager。)我目前面临的问题是,当我们一直水平滑动到结尾或开头时,有时垂直的 recyclerview(父级)会接管并更改页面。即使使用单个垂直回收器 View 也可以重新创建,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
PagerSnapHelper snapHelper = new PagerSnapHelper();
SearchAdapter searchAdapter = new SearchAdapter();
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(searchAdapter);
snapHelper.attachToRecyclerView(mRecyclerView);
}
从上到下或从下到上滑动/滑动将按预期更改页面。但是,如果您进行水平运动(从左到右或从右到左),有时会出现垂直滑动。看起来 PagerSnapHelper 对快速移动非常敏感。当水平滑动而不是垂直滑动时,有什么方法可以避免此页面更改?这个问题在我的案例中更为明显,因为我也有一个水平的 pagersnaphelper。
可能的解决方案:
如果需要,我很乐意提供更多上下文/代码。拥有两个 PagerSnapHelper 可能不是 Android 中的当前模式,但即使我去掉那部分,我想知道为什么 PagerSnapHelper 对某些手势如此敏感。
最佳答案
我想出了一个问题,当必须在父级为垂直的地方使用 PagerSnapHelpers 时,垂直父级将一些水平滑动混淆为垂直。为了避免这种混淆,我拦截了被检测为水平的事件,并不允许父级使用此类事件。这是我所做的简化版本:
public class VerticalRecyclerView extends RecyclerView {
private GestureDetector mGestureDetector;
public VerticalRecyclerView(Context context) {
super(context);
init();
}
public VerticalRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public VerticalRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
setLayoutManager(layoutManager);
mGestureDetector = new GestureDetector(getContext(), new HorizontalScrollDetector());
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
if (mGestureDetector.onTouchEvent(e)) {
return false;
}
return super.onInterceptTouchEvent(e);
}
public class HorizontalScrollDetector extends
GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceX) > Math.abs(distanceY);
}
}
}
他们的关键是如何检测滚动是否应该被认为是水平的,如 return Math.abs(distanceX) > Math.abs(distanceY);
关于android - 使用 PagerSnapHelper 的垂直和水平 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45342083/
我正在使用水平 RecyclerView 和 PagerSnapHelper 使其看起来像一个 ViewPager。它正在显示 CardViews。 我的问题是,如何让它显示下一张和上一张卡片边缘的一
我想弄清楚实现两个列表的最佳方式是什么,父列表可以垂直滑动,子列表可以水平滑动。假定父列表是一个无限列表,而子列表最多可以有 n 页。RecyclerView 似乎是这项工作的最佳工具,并且考虑到添加
我在水平 RecyclerView 中使用 PagerSnapHelper 来实现类似 View 寻呼机的行为。 final PagerSnapHelper pagerSnapHelper = new
我正在寻找一种使用 RecyclerView 在我的项目之间添加空格的方法和 PagerSnapHelper . 为了证明我在这里的意思是一个 gif: 正如您在上面看到的,两张图片之间有一点黑色空间
我使用以下代码将 PagerSnapHelper 附加到带有 Horizontal LinearLayoutManager 的 RecyclerView。 SnapHelper snapHelpe
我是一名优秀的程序员,十分优秀!