gpt4 book ai didi

android - 使用 PagerSnapHelper 的垂直和水平 RecyclerView

转载 作者:行者123 更新时间:2023-11-29 15:38:31 29 4
gpt4 key购买 nike

我想弄清楚实现两个列表的最佳方式是什么,父列表可以垂直滑动,子列表可以水平滑动。假定父列表是一个无限列表,而子列表最多可以有 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。

可能的解决方案:

  • 扩展 RecyclerView 控件 onTouchEvent 和 OnInterceptTouchEvent。还没有找到使用它的方法。
  • 使用手势检测器

如果需要,我很乐意提供更多上下文/代码。拥有两个 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com