簡単な質問:
ListView
では、次のコードを使用します。
list.addHeaderView(headerView);
gridview
で作業する場合の対処方法は?
ありがとう。
GridView
を使用したヘッダービューまたはフッタービューはサポートされていません。
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は、列の数だけ項目の数を増やして偽の行を作成し、その項目のヘッダービューを返します。
サンプルコード:
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'
これを使えます。最後のアイテム数に到達/終了すると、グリッドの下部にフッターが表示/非表示になります。実際にはスクロールしませんが、違いはほとんどわかりません。
アクティビティ/フラグメントの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>
アダプタの「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
テストしていませんが、動作するはずです。
ListViewを使用して、リストの各行を実際にはグリッドの行のようにする必要があります。したがって、3列のグリッドがある場合、3列のように見えるListViewのレイアウトを作成します。次に、アダプターを動作させるためにアダプターの特定の側面を変更して、ListViewの各行が実際に3行のデータを表すようにする必要があります-つまり、getCount()/ 3タイプのものです。
AsymmetricGridView を使用して、rowSpanが大きいヘッダー/フッターを指定すると、行全体を取得できます。
最初の行のセルの外観を変更してみませんか?列の数がわかっている場合は、ヘッダーに表示される項目の数=列の数がわかります。
このライブラリを使用できます http://tonicartos.github.io/StickyGridHeaders/
これにより、スティッキーなヘッダーを作成できます(リストをグループ化し、現在のグループのヘッダーを表示したままにするため)。スティッキー機能をオフにすることもできます。
ライブラリなどを使用せずに目的の機能を実現する方法があります。
編集:GoogleでHeaderGridView実装を借りるだけです ここ を参照
フッター用にカスタマイズすることもできます。以下の提案は複雑すぎて、さらに調整が必要です。具体的な詳細については説明しませんが、これだけです。
1)サブクラスGridView
2)onScrollChangedをオーバーライド
3)スクロールするたびにオフセットを計算します
4)parentView(headerViewとgridviewを含むビュー)の変換yを-Offset。(view.setTranslationY(-offset)に設定します。また、特定のオフセットに達すると停止するifステートメントもあります。スクロール。
5)グリッドビューがattachToGridview(View view)のようなメソッドを持つことができるように、これをうまく構造化したいことは明らかです。私はこれが機能する完全な実装を持っています。
GridViewにはビューがリサイクルされるというバグがあるため、オフセットを取得する方法については GridViewのスクロールオフセット を参照してください。