gpt4 book ai didi

android - 如果用户在 ViewPager 中向左或向右滑动,是否可以拦截触摸事件并转移到 ListView

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

我有一个包含两个 fragment 的 ViewPager,每个 fragment 都包含带有可滑动列表项的 ListView 。为了让用户更容易滑动,我希望如果用户在第一个 fragment 中向左滑动, ListView 会拾取滑动。如果用户在第二个 fragment 中向右滑动, ListView 会拾取滑动。由于只有两个 fragment ,因此 ListView 拾取滑动是有意义的,而不是 viewpager,因为在这两个 fragment 之后没有更多的 fragment 可以滚动到。

那么,是否可以拦截触摸,并根据正在显示的 viewpager 页面和滑动方向将其传递给 ListView ?

这是我正在使用的可滑动 ListView 库:https://github.com/timroes/EnhancedListView

最佳答案

我认为您可以自定义 ViewPager 并在 ViewPagercanScroll 方法中控制 ListView 滑动的行为>.

我尝试了一个示例,它似乎工作正常。您可以使用此自定义 ViewPager

public class CustomViewPager extends ViewPager {

public CustomViewPager(Context context) {
super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof ViewPager) {
if (getChildAt(getCurrentItem()) != null) {
//get the ListView of current Fragment
EnhancedListView enhancedListView = (EnhancedListView) getChildAt(getCurrentItem()).findViewById(R.id.list);
//If the user is in first page and tries to swipe left, enable the ListView swipe
if (getCurrentItem() == 0 && dx > 0) {
enhancedListView.enableSwipeToDismiss();
}
//If the user is in second page and tries to swipe right, enable the ListView swipe
else if (getCurrentItem() == 1 && dx < 0) {
enhancedListView.enableSwipeToDismiss();
}
//Block the ListView swipe there by enabling the parent ViewPager swiping
else {
enhancedListView.disableSwipeToDismiss();
}
}
}
return super.canScroll(v, checkV, dx, x, y);
}

}

此外,您还必须对 EnhancedListView 库进行一些更改。因为 canScroll 方法在 ACTION_DOWN 事件之后调用,如果我们在 canScroll 方法中启用滑动 - 它会跳过为 ACTION_DOWN< 定义的逻辑 事件,它可能会导致意外行为。因此,仅当触摸事件为 ACTION_MOVE 时才阻止滑动。这些是 EnhancedListView 库的 onTouchEvent 的变化。

//EnhancedListView class
@Override
public boolean onTouchEvent(MotionEvent ev) {

if (!mSwipeEnabled && (ev.getAction() == MotionEvent.ACTION_MOVE)) {
return super.onTouchEvent(ev);
}

.....

我不确定这是否是解决问题的完美解决方案,但它工作得很好。

如果问题或答案不清楚,这里有一些示例应用程序的屏幕截图。

  • 应用程序由带有两个 fragment 页面的 ViewPager 组成。每个页面都有一个 EnhanedListView (提供滑动以关闭/删除功能)。由于父 ViewPager 和子 List 项都可以滑动,因此会导致冲突。默认情况下,滑动由子 ListItem 拾取,这会阻止父 ViewPager 滑动。

    enter image description here

所需的解决方案:

  • 如果用户在第一页并向右滑动,则应滑动列表项。

    enter image description here

  • 如果用户在第二页并向左滑动,则应滑动列表项。

    enter image description here

  • 在其他情况下,应该滑动 ViewPager

更新:为了修复 SwipeRefreshLayout 的错误,这里是自定义 ViewPager 代码的细微变化。

 public class ScrollLock extends ViewPager {


public ScrollLock(Context context) {
super(context);
}

public ScrollLock(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof ViewPager) {
if (getChildAt(getCurrentItem()) != null) {
//set it so it does not swipe to refresh while swiping away a list item
SwipeRefreshLayout swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);

//get the ListView of current Fragment
EnhancedListView enhancedListView = (EnhancedListView) getChildAt(getCurrentItem()).findViewById(R.id.listView1);
//If the user is in first page and tries to swipe left, enable the ListView swipe
if (getCurrentItem() == 0 && dx > 0) {
enhancedListView.enableSwipeToDismiss();
swipeLayout.setEnabled(false);
return true;
}
//If the user is in second page and tries to swipe right, enable the ListView swipe
else if (getCurrentItem() == 1 && dx < 0) {
enhancedListView.enableSwipeToDismiss();
swipeLayout.setEnabled(false);
return true;
}
//Block the ListView swipe there by enabling the parent ViewPager swiping
else {
enhancedListView.disableSwipeToDismiss();
}
}
}
return super.canScroll(v, checkV, dx, x, y);
}

}

关于android - 如果用户在 ViewPager 中向左或向右滑动,是否可以拦截触摸事件并转移到 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047768/

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