【问题标题】:Can I set viewpager's item width?我可以设置 viewpager 的项目宽度吗?
【发布时间】:2017-11-09 02:27:23
【问题描述】:

我希望我可以在一个viewpager的页面中显示3个项目,但是现在我只能设置viewpager的填充值和边距值,所以它只能在一个viewpager的页面中显示一个项目。如何设置项目宽度?我想如果我可以设置更小的项目宽度,viewpager 将在页面中显示更多项目。

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    快速解答

    您想要的是在您为该ViewPager 所做的PagerAdapter 实现中覆盖getPageWidth

    例如,将其设置为 0.8f 将使单个页面仅覆盖 viewpagers 宽度的 80%,从而使下一页和/或上一页的一部分可见。

    @Override
    public float getPageWidth(final int position) {
        return 0.8f;
    }
    

    更多信息https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)

    其他说明

    还要注意,负边距只会导致单独的页面相互重叠。页边距用于定义每页之间的间距。

    如果没有配置备用 pageWidth(没有设置器,只有覆盖),默认情况下它将覆盖 100%,除非拖动,否则其他页面的任何部分都不可见。

    代码示例

    在这里https://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html可以找到一个很好的概述。

    布局中的视图分页器

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

    内联配置的适配器实现示例,这将进入 onCreate 或 onViewCreated 方法:

    // get a reference to the viewpager in your layout
    ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager);
    // this margin defines the space between the pages in the viewpager mViewPager.setPageMargin(context.getResources().getDimensionPixelSize(R.dimen.margin_normal));
    // setting the adapter on the viewpager, this could/should be a proper Adapter implementation in it's own class file instead
    mViewPager.setAdapter(new PagerAdapter() {
    
        // just example data to show, 3 pages
        String[] titles = {"Eins", "Zwei", "Drei"};
        int[] layouts = {R.layout.layout1, R.layout.layout2, R.layout.layout3};
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
            // here you can inflate your own view and dress up
            ViewGroup layout = (ViewGroup) inflater.inflate(layouts[position], container, false);
            container.addView(layout);
            return layout;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View)object);
        }
    
        @Override
        public float getPageWidth(final int position) {
            return 0.8f;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    
        @Override
        public int getCount() {
            return layouts.length;
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    });
    

    基于https://newfivefour.com/android-viewpager-simple-views.html的示例代码

    【讨论】:

    • 通用软件链接(第二个)确实有帮助!
    【解决方案2】:

    您是否尝试过将页边距设置为负值,参见setPageMargin(int)?如果我没记错的话,我读到有人意识到与您所描述的类似。

    或者,您可以改用Gallery,尽管我不得不承认我不是它们的忠实粉丝,因为它们似乎不那么灵活并且更容易出错。

    【讨论】:

    • 谢谢你的回答,我会试试的。我不能使用画廊,因为我需要向父视图添加一个列表,画廊有一些问题。
    • 谢谢,你的idea实现了。
    • 这会导致部分幻灯片无法触摸,因为它们之前的项目与它们重叠
    • @AsafDavid:这个答案已经过时了。要获得更好/更现代的替代方案来实现“页面上的多个项目”的效果,您可能需要使用PagerSnapHelper 来查看 RecyclerView。
    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2010-11-24
    相关资源
    最近更新 更多