ListView 和 ViewPager 中的 SwipeDismissListViewTouchListener

SwipeDismissListViewTouchListener in ListView and ViewPager

我有一个包含 ListFragmentTouchListener (SwipeDismissListViewTouchListener) 的 ViewPager。我这样修改了 ViewPager

public class CustomViewPager extends ViewPager {

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

private boolean pagingEnabled = true;

public void setPagingEnabled(boolean enabled) {
    pagingEnabled = enabled;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (!pagingEnabled) {
        return false; // do not intercept
    }
    return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!pagingEnabled) {
        return false; // do not consume
    }
    return super.onTouchEvent(event);
   }
  }

并且我在 ListFragment 方法中禁用了从 onOptionsItemSelected 滑动 ViewPager

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_edit) {
        CustomViewPager vp = (CustomViewPager) getActivity().findViewById(R.id.pager);
        vp.setPagingEnabled(false);
        getListView().requestDisallowInterceptTouchEvent(true);

    }
    return super.onOptionsItemSelected(item);
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    SwipeDismissListViewTouchListener touchListener =
            new SwipeDismissListViewTouchListener(
                    getListView(),
                    new SwipeDismissListViewTouchListener.DismissCallbacks() {

                        @Override
                        public boolean canDismiss(int position) {
                            return true;
                        }

                        @Override
                        public void onDismiss(ListView listView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                removeItem(position);
                            }

                        }
                    }
            );

    getListView().setOnTouchListener(touchListener);
    // Setting this scroll listener is required to ensure that during ListView scrolling,
    // we don't look for swipes.
    getListView().setOnScrollListener(touchListener.makeScrollListener());


}

ViewPager的滑动被禁用了,但是我不能运行SwipeDismissListViewTouchListener的问题。 我已经测试了这些答案,但对我不起作用

Nesting Android ViewPager, Swiping ListItems inside a ListView horizontally

ViewPager intercepts all x-axis onTouch events. How to disable?

Capture swipe to dismiss listview gestures in ViewPager

有什么解决办法吗?谢谢

只需几个简单的操作即可解决您的问题。

  • 移除 ViewPager 的 onInterceptTouch()onTouch(),它的 不需要。
  • 如果我没记错的话你错过了对 notifyDatasetChange() 的调用 在 onDismiss().
  • 中的 for 循环之后
  • 进入 SwipeTouchListener 代码并为方向创建一个子句 所以它将启用某个方向(现在想想 Google 仅在一个方向上启用滑动)。我猜你 仅对第一页和最后一页启用滑动,如果没有则 考虑一下,因为为中间页面启用 swipe2dismiss 是一个 糟糕的用户体验描述。

我找到了错误的解决方案。 在这个问题中,我回答了如何在 Fabric 库中禁用 onClick 方法。

项目相同项目相同,此相关错误。 在此方法中禁用视图、可点击和可长时间点击:

//helper method to disable subviews
    private void disableViewAndSubViews(ViewGroup layout) { 
        layout.setEnabled(false); 
        for (int i = 0; i < layout.getChildCount(); i++) { 
            View child = layout.getChildAt(i); 
            if (child instanceof ViewGroup) { 
                disableViewAndSubViews((ViewGroup) child); 
            } else { 
                child.setEnabled(false); 
                child.setClickable(false); 
                child.setLongClickable(false); 
            } 
        } 
    } 

并禁用 swipe2dismiss 方法

解决方案是在列表适配器上添加以下行:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final View view = super.getView(position, convertView, parent);

        //disable subviews to avoid links are clickable
        ViewTweetUtils.disableViewAndSubViews((ViewGroup) view);

        //enable root view and attach custom listener
        view.setEnabled(true);
        view.setClickable(false);

        return view;
    } 

view.setEnabled 只是行不通。您必须添加 view.setClickable(false)。为什么?我不知道,但它有效。

感谢您的帮助