listView
からヘッダーを削除しようとすると問題が発生します。最初はaddHeaderView()
を使用して追加しますが、別のレイアウトに変更すると非表示にしたいのですが、removeHeaderView()
が機能しません...
私も可視性をGONEに設定してみましたが、消えません...
私に何ができる?
前もって感謝します
以下のアプローチを試してください。
Android ListView#addHeaderView
およびListView#addFooterView
メソッドは奇妙です。ListViewがヘッダーとフッターを考慮できるように、ListViewのアダプターを設定する前にヘッダーとフッターのビューを追加する必要があります。そうしないと例外が発生します。ここでは、headerViewとしてProgressBar(スピナー)を追加します。
//スピナーは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);
ヘッダーが表示されなくなります。上部に醜いスペースはもうありません!
ほとんどの人はAddHeaderView
の使用を好みませんが、複雑なアダプタの変更を回避したり、ヘッダーがそれらにあまり関連していない場合に、非常に便利であると感じることがあります。
この簡単なトリックでシームレスにヘッダーを削除/追加:
空のLinearLayout
とorientation vertical
、高さwrap_content
を唯一のヘッダービューとして追加します(mListView
をターゲットlistView
にします):
LinearLayout mCustomHeaders=new LinearLayout(context);
mCustomHeaders.setOrientation(LinearLayout.VERTICAL);
mListView.addHeaderView(mCustomHeaders);
mListView.setAdapter (.......)
その後、リストがいっぱいでも、ランダムなものをどこにでもヘッダーとしてリストに追加できます。
mCustomHeaders.add(myHeaderView1);
mCustomHeaders.add(myHeaderView2);
mCustomHeaders.add(myHeaderView3);
また、いつでもすべてのヘッダーを削除できます。
mCustomHeaders.removeAllViews(); // will erase all headers
あなたはアイデアを得る....それが役に立てば幸い!
問題は、次の場合に常に新しいオブジェクトを作成することです。
View headerView = someView
したがって、新しいビューは、listViewヘッダーとして既に追加されているビューと同じではありません。これを試してください。
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
}
ここで、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に追加することでした(_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);
}
_
AddHeaderView()を使用している場合、その後ヘッダーを削除することはできません。
そのため、addHeaderView()は使用しないでください。むしろ、ビューの主な名簿をヘッダーとブレンドする独自のアダプターを作成します。私のMergeAdapterは特定のケースを処理しませんが、それを使用して複数の行ソースをブレンドする概念を確認できます。