ViewPager视图(不是片段)作为网格视图(Etsy' StaggeredGridView)的标题在片段中

时间:2014-08-28 20:59:56

标签: android android-layout android-fragments android-viewpager android-gridview

所以,我处于一种情况,我想在一个片段中添加一个ViewPager视图(不是片段)作为gridview的标题,但是当我将它设置为我的标题视图时,我的ViewPager不会出现。我目前正在使用Etsy的StaggeredGridView来允许我的gridview有一个标题,我使用PagerAdapter而不是FragmentStatePagerAdapter来滚动视图而不是片段。我打算只使用片段,但我不确定这是否会好,因为我认为,这将被认为是嵌套片段,只支持4.2+并通过支持库:我的应用程序支持4.0以上,此刻,我正在使用原生片段。

我也尝试以编程方式设置视图,但仍然没有显示。

我在ViewPager中设置了一个toast来查看是否实际创建了任何内容,并且toast按预期显示,但仍然没有标题。我试图膨胀的观点不应该是问题,因为如果我将它作为标题单独使用它就会显示出来。这是我到目前为止所做的:

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //inflate fragment which contains the gridview. Have a pointer to the gridview.
    View v = inflater.inflate(R.layout.fragment_menu, container, false);
    mGridView = (StaggeredGridView) v.findViewById(R.id.dishesGridView);

    View header = inflater.inflate(R.layout.view_pager_header, container, false);
    ViewPager mPager = (ViewPager) header.findViewById(R.id.pager);

    //list of views to test header
    final List<View> views = new ArrayList<View>();
    views.add(inflater.inflate(R.layout.menu_header, null));

    mPager.setAdapter(new PagerAdapter() {
        public View getView(int position) {
            return views.get(position);
        }
        @Override
        public Object instantiateItem(ViewGroup collection, int position) {
            View v = getView(position);
            ((ViewPager)collection).addView(v);
             Toast.makeText(getActivity(),
                        "Hello ViewPager",
                        Toast.LENGTH_SHORT).show();
            return v;
        }

        @Override
        public void destroyItem(ViewGroup collection, int position, Object view) {
            ((ViewPager) collection).removeView((View) view);
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0 == (View) arg1;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return views.size();
        }
    });
    mGridView.addHeaderView(mPager);
    return v;
}

这是view_pager_header.xml:

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

这是menu_header.xml:

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

<FrameLayout
    android:id="@+id/resHeader"
    android:layout_width="wrap_content"
    android:layout_height="100dp" >

    <com.platey.IonPlatey.RectangleImageView
        android:id="@+id/restaurant_icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop" />

    <ImageView
        android:src="@drawable/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>
<TextView
    android:id="@+id/resType"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:paddingRight="15dp"
    android:text="ResType Here"
    android:textColor="#d82727"
    android:textStyle="bold" />
</RelativeLayout>

1 个答案:

答案 0 :(得分:5)

原因:

基本上问题是由ViewPager android:layout_height="match_parent"引起的。

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

match_parent肯定是错误的,因为您不希望标题填满整个父级。但无论如何,match_parent都无法在StaggeredGridView中使用。

这与标准ListView项目等相同。 - match_parent是不允许的,在执行布局时,它只会被wrap_content替换。 遗憾的是,wrap_content不支持ViewPager,因为ViewPager无法包装其内容(它不知道子级大小)。

解决方案:

您有两种方法可以在那里正确显示ViewPager

  1. 只需指定静态高度(例如50dp
  2. 即可
  3. 如果您不想要静态高度,请扩展您的ViewPager并执行自己的测量。
  4. 截图

    以下是match_parent的屏幕截图。您可以看到ViewPager也未显示(高度为零):

    enter image description here

    并且具有静态高度:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.view.ViewPager 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
    

    enter image description here