ViewPager嵌套在ViewPager中。

7

我是一个新手,在android方面需要完成课程作业,希望得到任何帮助。

我的任务如下:

1)在一个Activity中使用两个ViewPagers(不嵌套)

2)在一个ViewPager中嵌套另一个ViewPager

我找到了类似的问题,但我无法使用它。 ViewPager inside ViewPager

我添加了第一个ViewPager,但不知道下一步该怎么做。

LayoutInflater inflater = LayoutInflater.from(this); //this - context of my activity
List<View> pages = new ArrayList<View>();
View page = inflater.inflate(R.layout.activity_main, null);
//next I adding some buttons on page
pages.add(page);

page = inflater.inflate(R.layout.activity_main2, null);  //my second page
//some buttons
pages.add(page);

page = inflater.inflate(R.layout.activity_main3, null);  //my third page
//some buttons
pages.add(page);

SamplePagerAdapter pagerAdapter = new SamplePagerAdapter(pages);
ViewPager viewPager = new ViewPager(this);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(0);          
setContentView(viewPager);

如果我添加ViewPager2并设置setContentView(viewPager2),那么我的ViewPager1就会丢失。我为这两个问题花费了很多时间,请帮忙解决一下...
//这是我需要完成的草图。 抱歉,我无法附加我的草图...

3
我觉得“一个ViewPager嵌套在另一个ViewPager中”很可能无法正常工作。 - CommonsWare
1
检查我的答案在这里 https://dev59.com/aYPba4cB1Zd3GeqPoy8g#25800572 - Abhishek V
@CommonsWare,为什么不呢?Tinder正在这样做,对吧? - Abdellah Benhammou
@AbdellahBenhammou:你需要问Tinder。 - CommonsWare
@CommonsWare,昨天我在一个应用上做了这个功能,流程看起来很不错,很友好。 - Abdellah Benhammou
这篇文章包含一个嵌套的ViewPager,附带使用示例:https://www.journaldev.com/19336/android-nested-viewpager-vertical-viewpager - AnupamChugh
4个回答

16

我向内部的ViewPager添加了一个OnTouchListener

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(
                event.getAction() == MotionEvent.ACTION_DOWN &&
                v instanceof ViewGroup
        ) {
                ((ViewGroup) v).requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }
};

这只是在内部的ViewPager上检测ACTION_DOWN触摸事件,并防止外部的ViewPager拦截它。因为它返回false,所以只有ACTION_DOWN事件会被触发;所有其他事件都将被忽略。您可以将此侦听器添加到要“保护”免受外部ViewPager滚动影响的每个元素中,尽管显然,如果您想在这些元素上捕获任何其他触摸行为,您需要在触摸侦听器内处理它们并可能实现更好的侦听器。


1
谢谢macloving,这帮了我很多!! - Hw.Master
这会阻止父级滑动,但我仍然需要嵌套的可以滑动。 - StarWind0

1
我认为你应该重新考虑在另一个viewpager中添加viewpager。您将遇到许多触摸事件的问题,而用户体验可能会令人困惑/棘手,我建议您重新考虑这个问题。
现在回答问题1:
在活动的xml文件(/layout/activity.xml)中声明两个viewpagers,例如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
            android:id="@+id/viewpager1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    <android.support.v4.view.ViewPager
            android:id="@+id/viewpager2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

</LinearLayout>

然后在您的活动的onCreate方法中填充xml并连接两个viewpagers:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    mViewpager1 = (ViewPager) findViewById(R.id.viewpager1);
    mViewpager2 = (ViewPager) findViewById(R.id.viewpager2);
}

不要忘记声明这两个变量 private ViewPager mViewpager1, mViewpager2;

之后,您可以随心所欲地使用 mViewpager1 和 mViewpager2。另一个提示是,我建议您使用适配器来设置页面,而不是手动一个一个地将它们添加到每个 viewpager 中,这样会更加清晰和易于操作。


1

关于嵌套的Viewpager并禁用嵌套的Viewpager滑动(如果您想使用嵌套中的按钮设置选定的页面),以下是一个解决方案:

对于嵌套的ViewPager,您可以创建一个子类ViewPager并添加以下内容:

 public boolean onInterceptTouchEvent(MotionEvent event) {
        //if you want to send the Touches to this Viewpager (the nested) //change true to false
      return true;    
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages on this inner 

        //send swipe to father instead of child
        if (this.getParent()!=null &&  this.getParent() instanceof ViewPager) {
            ((ViewPager) this.getParent()).onTouchEvent(event);
        }
        return false;
    }

在布局中,您可以放置以下内容:

<com.mypackage.mycustomapp.myviews.MyViewPager
            android:id="@+id/myNestedviewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

0
  • 使用单个viewPager和ConcatAdapter
  • //sample usage
    val strings = listOf("a", "b", "cde", "f", "g", "h")
    viewPager.adapter = ConcatAdapter(
       strings.partition({ string -> string.length > 1 }, { string -> string.split("") })
         //{{a, b}, {c, d, e}, {f, g, h}}
          .map { StringAdapter(it) }.toList() 
    )
    
    /**
     * custom partition function as kotlin List extension
     */
    
    fun <E> List<E>.partition(shouldFlatten: (e: E)->Boolean, flatten: (e: E)->List<E>) : List<List<E>>{
       val partitions = mutableListOf<List<E>>()
       var currentPartition = mutableListOf<E>()
       val listIterator = this.listIterator()
       while (listIterator.hasNext()) {
          val next = listIterator.next()
          if (shouldFlatten(next)) {
             if (currentPartition.isNotEmpty()) {
                partitions.add(currentPartition)
                currentPartition = mutableListOf()
             }
             partitions.add(flatten(next))
          } else {
             currentPartition.add(next)
          }
       }
       if (currentPartition.isNotEmpty()) {
          partitions.add(currentPartition)
       }
       return partitions
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接