Android ListView内部视图寻呼机赢得';应用页面转换器时,请不要滚动

Android ListView内部视图寻呼机赢得';应用页面转换器时,请不要滚动,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我有一个ViewPager,其中页面包含ListView。 一切正常,我的viewPAger和ListViews都正常工作:可以在页面之间滑动,ListViews可以垂直滚动 现在,我想添加一个PageTransformer,以平滑我在google文档中使用的分页anbd 现在我有了一个很好的动画,当在视图之间滑动时,列表不再是可滚动的 代码如下: @Override public void onViewCreated(View view, Bundle savedInstanceState)

我有一个ViewPager,其中页面包含ListView。 一切正常,我的viewPAger和ListViews都正常工作:可以在页面之间滑动,ListViews可以垂直滚动

现在,我想添加一个PageTransformer,以平滑我在google文档中使用的分页anbd

现在我有了一个很好的动画,当在视图之间滑动时,列表不再是可滚动的

代码如下:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    LayoutInflater inflater = LayoutInflater.from(getActivity());
    viewPager = (ViewPager) view.findViewById(R.id.bookMenuPager);
    viewPager.setPageTransformer(false, new ZoomOutPageTransformer());
    pagerAdapter = new MenuPagerAdapter();
    viewPager.setAdapter(pagerAdapter);
}


class MenuPagerAdapter extends PagerAdapter{

    @Override
    public int getCount() {

        return 3; //change this as needed
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return view.equals( o );
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(position == 0){
            if(!rootMenuAdded){
                viewPager.addView(rootMenucont, 0);
                rootMenuAdded = true;
            }
            return rootMenucont; 
        }else if(position == 1){
            if(!level1MenuAdded){
                viewPager.addView(level1MenuCont, 0);
                level1MenuAdded = true;
            }
            return level1MenuCont;
        }else if(position == 2){
            if(!level2MenuAdded){
                viewPager.addView(level2MenuCont, 0);
                level2MenuAdded = true;
            }
            return level2MenuCont;
        }

        //we got a problem houston
        return null;
    }
 }
以及页面的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/level1MenuCont"
android:layout_height="match_parent"
android:layout_width="match_parent"
>

<ListView
    android:id="@+id/level1Menu"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="#f02bb6"
    >
</ListView>

</RelativeLayout> 

我该怎么做才能让列表按预期滚动?PageTransformer在我的ListView中中断了什么,使它不再滚动? 这是已知的bug吗


谢谢您的帮助:)

我不知道您是否能正常工作,但我有相同的问题,有一个PageDepthTransformer。虽然我使用的是gridview,但滚动可以工作,但是我的后续片段似乎有焦点,并且我的顶级片段没有注册正确的onClick()事件

我的解决方法是将全局布局侦听器添加到viewPager,并将当前视图放在前面

viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {

        View view = viewPager.getChildAt(currentFragmentPosition);

        if (view != null) {
            view.bringToFront();
        }
    }
)};

对我来说,这似乎像是黑客行为,而我还没有在轮换方面完全做到这一点。但希望它能对您有所帮助。

我想我已经找到了解决这个问题的方法

经过一些调查,我认为只有当你应用一个
PageTransformer
来改变
视图的坐标时,才会发生这种情况,所以
视图都是相互重叠的(这两个示例变压器就是这样做的)

当您沿新视图的Z索引低于旧视图的方向滑动时(通常是向后滑动),这些变换器发生的情况是,旧视图位于新视图的顶部,Alpha==0,并且是稍后被“重影”触及的视图

不幸的是,@ngatyrauks
bringToFront()
的解决方案对我不起作用(尽管它确实应该起作用)

但是,我调整了转换器,使不可见的
视图将其可见性更改为“消失”。这就是诀窍

我还没有调查这个可见性更改是否有任何副作用(一个
消失的
视图将返回
null
和布局中的零等,所以这可能会破坏
ViewPager
中的其他内容),但到目前为止,它工作得很好

我在这里发布了一个经过调整的
DepthPageTransformer
(在文档中也是如此)和这些更改。希望它能帮助任何人

            package com.regaliz.gui.fx;

            import android.util.Log;
            import android.view.View;
            import android.support.v4.view.ViewPager;

            public class DepthPageTransformer implements ViewPager.PageTransformer {

                private static final String TAG="DepthTransformer";
                private static float MIN_SCALE = 0.75f;

                public void transformPage(View view, float position) {
                    int pageWidth = view.getWidth();
                    Log.d(TAG, "VIew "+view+" Position: "+position);

                    if (position <= -1) { // [-Infinity,-1) ] ***

                        // RLP> I Changed to include "-1" as well: When position is -1, the view is not visible

                        // This page is way off-screen to the left.

                        view.setAlpha(0);
                        Log.d(TAG, "VIew "+view+" Position: "+position+", way left");
                        view.setVisibility(View.GONE);

                    } else if (position <= 0) { // [ (-1,0]
                        // Use the default slide transition when moving to the left page
                        view.setAlpha(1);
                        view.setTranslationX(0);
                        view.setScaleX(1);
                        view.setScaleY(1);
                        if (position==0) {
                            Log.d(TAG, "View "+view+" focused now?");
                        }

                        if (view.getVisibility()!=View.VISIBLE)
                            view.setVisibility(View.VISIBLE);

                    } else if (position <= 1) { // (0,1]

                        // Fade the page out.
                        view.setAlpha(1 - position);

                        // Counteract the default slide transition

                        // I THINK THIS IS WHAT BREAKS EVERYTHING
                        // ViewPager normally has the views one after another, but this makes all views on top

                        view.setTranslationX(pageWidth * -position);

                        // Scale the page down (between MIN_SCALE and 1)

                        float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
                        view.setScaleX(scaleFactor);
                        view.setScaleY(scaleFactor);

                        if (position==1) {

                            Log.d(TAG, "View "+view+" invisible now?");
                            view.setVisibility(View.GONE);
                            // we totally hide the view. This seems to solve focus issue

                        } else {
                            if (view.getVisibility()!=View.VISIBLE)
                                view.setVisibility(View.VISIBLE);
                        }

                    } else { // (1,+Infinity]
                        // This page is way off-screen to the right.
                        view.setAlpha(0);

                        // we totally hide the view. This seems to solve focus issue
                        // I have to check for strange side-effects, but so far I found none :)

                        view.setVisibility(View.GONE);

                        Log.d(TAG, "VIew "+view+" Position: "+position+", way right");
                    }
                }
            }
package com.regaliz.gui.fx;
导入android.util.Log;
导入android.view.view;
导入android.support.v4.view.ViewPager;
公共类DepthPageTransformer实现ViewPager.PageTransformer{
专用静态最终字符串标记=“DepthTransformer”;
专用静态浮动最小刻度=0.75f;
公共页面(视图、浮动位置){
int pageWidth=view.getWidth();
日志d(标签“视图”+视图+”位置:“+位置);
如果(位置I也更改为包含“-1”:当位置为-1时,视图不可见
//这个页面在屏幕的左边。
视图。setAlpha(0);
日志d(标签“视图”+视图+”位置:“+位置+”,左侧);
view.setVisibility(view.GONE);

}else if(位置以下是原因的详细信息

在4.1之后,框架将自定义子绘图顺序视为发送触摸事件的隐含Z顺序。如果您的视图在此页面转换后重叠,则在较旧的平台版本上,它们可能不会以预期顺序接收触摸事件。请检查哪个视图接收触摸事件以确定

如果这是您看到的,您有几个选择:

  • 在PagerAdapter中添加/删除子视图时强制执行所需的顺序
  • 当页面不再完全可见时,删除PageTransformer应用的X转换,即“position”参数报告完全-1或1
这是我的解决方案

  public void transformPage(View view, float position) {
    int pageWidth = view.getWidth();

    if (position <= -1 || position >= 1) { // [-Infinity,-1) ] ***

        // [-Infinity,-1] or [1,+Infinity]
        // This page is way off-screen to the left or way off-screen to the right.

        view.setAlpha(0);
        view.setTranslationX(0);
        view.setScaleX(1);
        view.setScaleY(1);

    } else if (position <= 0) { // [ (-1,0]
        // Use the default slide transition when moving to the left page
        view.setAlpha(1);
        view.setTranslationX(0);
        view.setScaleX(1);
        view.setScaleY(1);

    } else if (position < 1) { 
        // (0,1)
        // Fade the page out.
        view.setAlpha(1 - position);
        view.setTranslationX(pageWidth * -position);

        // Scale the page down (between MIN_SCALE and 1)

        float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
        view.setScaleX(scaleFactor);
        view.setScaleY(scaleFactor);

    } 
}
public页面(视图、浮动位置){
int pageWidth=view.getWidth();
如果(位置=1){/[-无穷大,-1)]***
//[-无限,-1]或[1,+无限]
//此页面左侧远离屏幕或右侧远离屏幕。
视图。setAlpha(0);
view.setTranslationX(0);
视图.setScaleX(1);
视图。设置刻度(1);

}否则如果(位置嗨!我想我也有同样的问题。对你的解决方案有很大的希望,因为在我的例子中,焦点似乎停留在新旧可视页面之间。我尝试了这个,也在其他地方给bringToFront打了电话,但是这个电话并不能解决问题。你有什么其他建议吗?我已经调查过,发现我只有is如果我向后滑动,sue:“触摸”焦点仍保留在刚刚离开屏幕的视图上。解决方案很有意义:该视图的z索引大于当前项目的z索引。但无论我调用bringToFront还是requestFocus……幻影触摸焦点仍保留在另一个视图上:(这是唯一一个对我有效的解决方案。谢谢。绝对没有问题相信这是可行的。我已经准备好点击一些东西了。搜索listfragment viewpager没有滚动,并且忘记了我已经添加了转换。如果示例失败了?我正在点击更多的答案。哈哈,谢谢,我也遇到了同样的情况,这是完整的。)疯狂和我不得不微调试wtf正在打开…最后我试图完全避免页面转换器,我不喜欢片段处于随机状态。对我来说是有效的…现在…这是一个如此丑陋的错误!而且不容易破解,直到你发现你的触摸事件确实在某处…某处