web-dev-qa-db-ja.com

GridViewは、ListViewと同じようにフッターとヘッダーを持つことができますか?

簡単な質問:

ListViewでは、次のコードを使用します。

list.addHeaderView(headerView);

gridviewで作業する場合の対処方法は?

ありがとう。

26
necixy

GridViewを使用したヘッダービューまたはフッタービューはサポートされていません。

32
CommonsWare

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は、列の数だけ項目の数を増やして偽の行を作成し、その項目のヘッダービューを返します。

25
AlexM

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ビルド:。

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

これを使えます。最後のアイテム数に到達/終了すると、グリッドの下部にフッターが表示/非表示になります。実際にはスクロールしませんが、違いはほとんどわかりません。

アクティビティ/フラグメントの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>
5
Frank

アダプタの「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

テストしていませんが、動作するはずです。

4
milechainsaw

ListViewを使用して、リストの各行を実際にはグリッドの行のようにする必要があります。したがって、3列のグリッドがある場合、3列のように見えるListViewのレイアウトを作成します。次に、アダプターを動作させるためにアダプターの特定の側面を変更して、ListViewの各行が実際に3行のデータを表すようにする必要があります-つまり、getCount()/ 3タイプのものです。

4
Tyler

AsymmetricGridView を使用して、rowSpanが大きいヘッダー/フッターを指定すると、行全体を取得できます。

2
Felipe Lima

最初の行のセルの外観を変更してみませんか?列の数がわかっている場合は、ヘッダーに表示される項目の数=列の数がわかります。

1
Guillaume

このライブラリを使用できます http://tonicartos.github.io/StickyGridHeaders/

これにより、スティッキーなヘッダーを作成できます(リストをグループ化し、現在のグループのヘッダーを表示したままにするため)。スティッキー機能をオフにすることもできます。

1
Matt Wolfe

ライブラリなどを使用せずに目的の機能を実現する方法があります。

編集:GoogleでHeaderGridView実装を借りるだけです ここ を参照
フッター用にカスタマイズすることもできます。以下の提案は複雑すぎて、さらに調整が必要です。具体的な詳細については説明しませんが、これだけです。

1)サブクラスGridView
2)onScrollChangedをオーバーライド
3)スクロールするたびにオフセットを計算します
4)parentView(headerViewとgridviewを含むビュー)の変換yを-Offset。(view.setTranslationY(-offset)に設定します。また、特定のオフセットに達すると停止するifステートメントもあります。スクロール。
5)グリッドビューがattachToGridview(View view)のようなメソッドを持つことができるように、これをうまく構造化したいことは明らかです。私はこれが機能する完全な実装を持っています。
GridViewにはビューがリサイクルされるというバグがあるため、オフセットを取得する方法については GridViewのスクロールオフセット を参照してください。

1
Jessicardo