解决SlideDetailsLayout与ViewPager垂直滚动事件冲突问题

来源:互联网 发布:无言网络歌手歌词 编辑:程序博客网 时间:2024/05/22 17:10

最近做项目用到SlideDetailsLayout这个控件,github地址:https://github.com/cnbleu/SlideDetailsLayout

在behind页面里用到了ViewPager,发现里面嵌套的ScrollView与SlideDetailsLayout出现事件冲突,表现为SrollView没有滑动回顶部就返回SlideDetailsLayout的front页面了。

经过研究SlideDetailsLayout的代码后,通过在innerCanChildScrollVertically方法中加入对ViewPager的处理逻辑后最终解决了这个问题,下面是具体步骤。


第一步:在定义的PagerAdpter类中通过重写setPrimaryItem方法获取到当前显示的Fragment

public Fragment currentFragment;

@Override

public void setPrimaryItem(ViewGroup container, int position, Object object) {
    super.setPrimaryItem(container, position, object);
    currentFragment = (Fragment) object;
}


第二步:在SlideDetailsLayout类中的innerCanChildScrollVertically方法中增加对ViewPager的处理逻辑,下面是修改后的方法。

private boolean innerCanChildScrollVertically(View view, int direction) {
        if (view instanceof ViewGroup) {
            final ViewGroup vGroup = (ViewGroup) view;
            View child;
            boolean result;
            for (int i = 0; i < vGroup.getChildCount(); i++) {
                child = vGroup.getChildAt(i);
                //支持ViewPager里面的子控件滚动 by:York
                if (child instanceof ViewPager) {
                    final ViewPager viewPager = (ViewPager) child;
                    //自定义的PageAdapter
                    final SilderPagerAdapter pagerAdapter = (SilderPagerAdapter) viewPager.getAdapter();
                    return innerCanChildScrollVertically(pagerAdapter.currentFragment.getView(), direction);
                } else {
                    if (child instanceof View) {
                        result = ViewCompat.canScrollVertically(child, direction);
                    } else {
                        result = innerCanChildScrollVertically(child, direction);
                    }

                    if (result) {
                        return true;
                    }
                }
            }
        }
        return ViewCompat.canScrollVertically(view, direction);
}


至此,大功告成!



0 0
原创粉丝点击