GridView可以像ListView一样有页脚和页眉吗?

时间:2011-04-26 12:22:07

标签: android android-gridview

一个简单的问题:

ListView我使用此代码:

list.addHeaderView(headerView);

在处理gridview时如何处理?

感谢。

11 个答案:

答案 0 :(得分:32)

GridView不支持页眉或页脚视图,抱歉。

答案 1 :(得分:25)

在Google相册应用程序中有一个非常好的GridView实现,并且支持标题,因为它是可以按原样使用的OSS代码,或者将其作为您自己实现的参考: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.3_r2.1/com/android/photos/views/HeaderGridView.java

基本思想非常简单 - WrapperAdapter通过按列数增加项目数来创建假行,然后返回项目的标题视图。

答案 2 :(得分:5)

你可以用它。当您到达/离开最后一个项目数时,页脚会显示/隐藏在网格的底部。它实际上并没有滚动,但我几乎没有注意到它的区别。

在您的activity / fragment的onCreate / onCreateView中,您将OnScrollListener添加到GridView:

    ....
    GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview);
    gridview.setAdapter(adapter);
    final View footerView = mainView
            .findViewById(R.id.my_grid_footer_view);
    gridview.setOnScrollListener(new GridView.OnScrollListener() {

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

                if (firstVisibleItem + visibleItemCount == totalItemCount) {

                    // last item in grid is on the screen, show footer:
                    footerView.setVisibility(View.VISIBLE);

                } else if (footerView.getVisibility() != View.GONE) {

                    // last item in grid not on the screen, hide footer:
                    footerView.setVisibility(View.GONE);
                }
            }

        @Override
        public void onScrollStateChanged(AbsListView view,
                int scrollState) {
        }
    });

您的布局应如下所示。请注意gridview中的layout_weight(和layout_height)参数,当页脚变为可见时,需要为页脚创建正确的空间。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <GridView
        android:id="@+id/my_gridview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:columnWidth="160dp"
        android:gravity="center_horizontal"
        android:horizontalSpacing="12dp"
        android:numColumns="auto_fit"
        android:layout_weight="1"
        android:stretchMode="columnWidth"
        android:verticalSpacing="6dp" />

    <TextView
        android:id="@+id/my_grid_footer_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginBottom="8dp"
        android:orientation="horizontal"
        android:visibility="gone"
        android:text="footer text here" >
    </TextView>
</LinearLayout>

答案 3 :(得分:5)

enter image description here

示例代码:

GridViewWithHeaderAndFooter gridView = (GridViewWithHeaderAndFooter) v.findViewById(R.id.ly_image_list_grid);

LayoutInflater layoutInflater = LayoutInflater.from(this);
View headerView = layoutInflater.inflate(R.layout.test_header_view, null);
View footerView = layoutInflater.inflate(R.layout.test_footer_view, null);
gridView.addHeaderView(headerView);
gridView.addFooterView(footerView);

Gradle build:

compile 'in.srain.cube:grid-view-with-header-footer:1.0.12'

答案 4 :(得分:4)

您必须使用ListView,然后使列表的每一行看起来像它实际上是一行网格。因此,如果您有一个3列网格,那么您将为ListView创建一个看起来像3列的布局。然后,您必须修改适配器的某些方面以使其工作,以便每个ListView行实际上代表3行数据 - 所以你知道,getCount()/ 3类型的东西。

答案 5 :(得分:4)

如何检查适配器中的“0”索引元素?您可以为第一个自定义视图充气。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
            if(view==null){
                 if(position==0){
                      //  ...inflate header view
                 }else{
                      //  ...do as usual

没有测试过,但应该可以使用。

答案 6 :(得分:2)

您可以使用AsymmetricGridView并使用更大的rowSpan指定页眉/页脚,以便它们占据整行。

答案 7 :(得分:1)

为什么不更改第一行的单元格外观?如果你知道你有多少列,你知道标题中会出现多少项=列数。这对我有用

答案 8 :(得分:1)

您可以使用此库http://tonicartos.github.io/StickyGridHeaders/

允许您创建粘滞的标题(用于对列表进行分组并保持标题对当前组可见)。您也可以关闭粘性功能。

答案 9 :(得分:1)

有一种方法可以在不使用库或任何东西的情况下完成所需的功能。

编辑:只需借用谷歌的HeaderGridView实现,请参阅Here
您也可以为页脚自定义它。以下建议太复杂,需要更多调整。 没有详细说明,您需要做的就是这个。

1)子类GridView
2)覆盖onScrollChanged
3)每次滚动时计算偏移量 4)将parentView(包含headerView和gridview的视图)转换为-Offset。(view.setTranslationY(-offset)。一旦到达某个偏移量,它也会有一个if语句,它将停止滚动。
5)显然你想要很好地构建这个,所以你的gridview可以有一个像attachToGridview(View view)这样的方法。我有一个完整的实现这个工作 有关获取偏移量的帮助,请参阅Scroll offset of GridView,因为GridView有一个错误,即视图被回收。

答案 10 :(得分:-2)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
              android:layout_height="fill_parent" android:orientation="vertical">

    <com.test.Breadcrumbs android:layout_width="fill_parent" android:layout_height="100dp" />

    <GridView
            android:id="@+id/grid"
            android:numColumns="auto_fit"
            android:gravity="center"
            android:stretchMode="columnWidth"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:verticalSpacing="10dp"
            android:horizontalSpacing="10dp">
    </GridView>

</LinearLayout>

和面包屑:

public class Breadcrumbs extends LinearLayout {

    public Breadcrumbs(final Context context, final AttributeSet attrs) {
        super(context, attrs);

        final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutView = inflater.inflate(R.layout.breadcrumbs, this, true);

工作正常,滚动网格也可以。