からヘッダーを削除しようとすると、いくつかの問題が発生しlistView
ます。最初はaddHeaderView()
追加していたのですが、別のレイアウトに変更すると消えてしまいたいのですがうまくいきremoveHeaderView()
ません...
可視性をGONEに設定してみましたが、消えません...
私に何ができる?
前もって感謝します
下記のアプローチを試してください。
AndroidListView#addHeaderView
とListView#addFooterView
メソッドは奇妙です。ListViewのアダプターを設定する前にヘッダーとフッターのビューを追加して、ListViewがヘッダーとフッターを考慮できるようにする必要があります。そうしないと例外が発生します。ここでは、ProgressBar(スピナー)をheaderViewとして追加します。
//スピナーはProgressBarです
listView.addHeaderView(spinner);
そのスピナーを自由に表示および非表示にできるようにしたいのですが、ListViewを破棄せずにスピナーを再度追加することはできないため、完全に削除するのは危険です。覚えておいてください。それはアダプターです:
listView.removeHeaderView(spinner); //dangerous!
だから隠そう!それも難しいことがわかりました。スピナービュー自体を非表示にすると、ヘッダー領域は空になりますが、まだ表示されます。
次に、スピナーを非表示にしてみます。
spinner.setVisibility(View.GONE);
結果:ヘッダー領域はまだ醜いスペースで表示されます:
解決策は、進行状況バーをコンテンツをラップするLinearLayoutに配置し、コンテンツを非表示にすることです。そうすれば、コンテンツが非表示になると、ラッピングするLinearLayoutが折りたたまれ、技術的にはまだ存在しているが、0dipが高いheaderViewが生成されます。
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<!-- simplified -->
<ProgressBar
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
次に、レイアウトをヘッダーとして設定します。
spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null);
listView.addHeaderView(spinnerLayout);
また、非表示にする必要がある場合は、レイアウトではなく、レイアウトのコンテンツを非表示にします。
spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);
これで、ヘッダーが表示されなくなります。上部に醜いスペースはもうありません!
ヘッダー カウント > 0 かどうかを確認してから、ヘッダーを削除して再度追加します。
それは私にとってはうまくいきます。
View _headerView;
private void function HandleHeaderView(){
if(listView.getHeaderViewsCount() > 0)
{
listView.removeHeaderView(_headerView);
}
/* Add list view header */
_headerView = GetHeaderView();
listView.addHeaderView(_headerView);
}
private View GetHeaderView()
{
View header = getLayoutInflater().inflate(R.layout.header_layout, null);
// TODO: ...
return header
}
私のヘッダービューはどこdrawerLogoView
にありますか、これが私がしていることです:
drawerLogoView = mInflater.inflate(R.layout.navigation_drawer_custom_layout, null);
mDrawerList.addHeaderView(drawerLogoView,null,false);
LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
layOut.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 0));
そうすれば、見えなくなります:D 元に戻すには、これを使用できます:
LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
layOut.setLayoutParams(newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
少し変装したシナリオでこの問題に遭遇しました。私が扱っていた ListView は PreferenceFragment から来ており、ヘッダーは PreferenceCategory を表しています。そのため、ListView を設定する自由は非常に制限されていました。しかし、2つのアプローチがありました(このページの他の回答に部分的に触発されました). 1 つは、カスタム レイアウトを PreferenceCategory に追加することでした (カスタム PreferenceCategory 見出しextends android.preference.PreferenceCategory
を参照するクラスを使用)。しかし、私はより簡単な回避策を見つけました: この PreferenceCategory の最初の Preference のために、私はオーバーライドします:onCreateView()
@Override public View onCreateView(ViewGroup parent) {
parent.setTop(-parent.getChildAt(0).getTop());
return super.onCreateView(parent);
}
addHeaderView() を使用している場合、その後ヘッダーを削除することはできません。
そのため、addHeaderView() を使用しないでください。代わりに、ビューの主なリストとヘッダーをブレンドする独自のアダプターを作成します。私の MergeAdapter は特定のケースを処理しませんが、それを使用して、複数の行ソースをブレンドする概念を確認できます。