listView
からヘッダを削除しようとするといくつか問題が発生します。最初はaddHeaderView()
を使用して追加しますが、別のレイアウトに変更すると消えたいが、removeHeaderView()
は機能しません...リストビューからヘッダを削除
GONEに視認性を設定しても消えません
どうすればよいですか?事前
listView
からヘッダを削除しようとするといくつか問題が発生します。最初はaddHeaderView()
を使用して追加しますが、別のレイアウトに変更すると消えたいが、removeHeaderView()
は機能しません...リストビューからヘッダを削除
GONEに視認性を設定しても消えません
どうすればよいですか?事前
で
おかげであなたはaddHeaderViewを()を使用している場合は、あなたはその後にヘッダを削除することはできません。
したがって、addHeaderView()は使用しないでください。むしろ、 あなたのメインのリストをあなたのヘッダーとブレンドする独自のアダプターを作成してください。
下記のアプローチを試してみてください。..
アンドロイドListView#addHeaderView
とListView#addFooterView
:私の MergeAdapterがあなたの特定のケースを処理できませんが、あなたは ブレンド複数の行ソースの概念を確認するためにそれを使用することができますメソッドが奇妙です:ListViewのアダプタを設定する前にヘッダーとフッターのビューを追加して、ListViewがヘッダーとフッターを考慮できるようにしなければなりません。ここでは、headerViewとしてプログレス(スピナー)を追加します。
//スピナーは、我々は意志でそのスピナーを表示し、非表示にできるようにしたいが、あからさまにそれを除去することであると思いプログレス
listView.addHeaderView(spinner);
です
listView.removeHeaderView(spinner); //dangerous!
は、それでは、それを隠してみましょう: - 危険な私たちは、リストビューを破壊することなく、再びそれを追加することができませんでしたので、それがアダプタだ我々がした後、我々はaddHeaderViewことができない、覚えておいてください!それは難しいことでもあります。スピナービュー自体を隠すだけで、空ではあるが目に見えるヘッダー領域になります。
今スピナーを隠そう:
spinner.setVisibility(View.GONE);
結果:醜いスペースでまだ目に見えるヘッダエリア:
ソリューションが進行を置くことですLinearLayoutのバーでコンテンツをラップし、コンテンツを非表示にします。その方法は、包装のLinearLayoutは、そのコンテンツが非表示になっている場合、まだ技術的に存在するheaderViewその結果、崩壊、しかし0dip高いであろう。
<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);
ヘッダーが表示されなくなりました。上の醜いスペースはもうありません!
ほとんどの人はAddHeaderView
を使いたくないのですが、複雑なアダプターの変更を避けるため、またはヘッダーとあまり関係がない場合があることがよくあります。
:
私はヘッダのみを表示(mListView
がターゲットlistView
なりましょう)として、orientation vertical
と空LinearLayout
を追加し、高さwrap_content
:
LinearLayout mCustomHeaders=new LinearLayout(context);
mCustomHeaders.setOrientation(LinearLayout.VERTICAL);
mListView.addHeaderView(mCustomHeaders);
mListView.setAdapter (.......)
Thenafter、私はリストがいっぱいになった場合でも、ヘッダとしてリストに、どこでも、ランダムなものを追加することができます。
mCustomHeaders.add(myHeaderView1);
mCustomHeaders.add(myHeaderView2);
mCustomHeaders.add(myHeaderView3);
また、いつでも、すべてのヘッダを削除することができます。
mCustomHeaders.removeAllViews(); // will erase all headers
あなたがアイデアを得る....それが役に立てば幸い! drawerLogoView
は私headerviewで、ここで私は何をすべきかだ
これは非常にうまくいきました。 –
:
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にカスタムレイアウトを追加することでした(extends android.preference.PreferenceCategory
というクラスを使用、Custom PreferenceCategory Headingsを参照)。このPreferenceCategoryの最初の好みのために、私はonCreateView()
をオーバーライドします:しかし、私は簡単に回避策を見つけ
@Override public View onCreateView(ViewGroup parent) {
parent.setTop(-parent.getChildAt(0).getTop());
return super.onCreateView(parent);
}
を問題は、あなたが行うときは、常に新しいオブジェクトを作成しているということです。だから、
View headerView = someView
新しいビューには、これを試して、すでにリストビューのヘッダとして追加したビューと同じではありません。
View headerView = inflater.inflate(R.layout.adapter_datatable_saleitem_header, null, false);
headerView.setTag(this.getClass().getSimpleName() + "header");
if (listView.getHeaderViewsCount() > 0) {
View oldView = listView.findViewWithTag(this.getClass().getSimpleName() + "header");
if (oldView != null) {
listView.removeHeaderView(oldView);
}
}
ヘッダ数> 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
}
あなたはヘッダを指すように変数を持っている場合は、このリンクを参照して、ヘッダビューを削除することができます。http://stackoverflow.com/a/39286390/1817569 – Hamid