2012-11-28 26 views
20

listViewからヘッダを削除しようとするといくつか問題が発生します。最初はaddHeaderView()を使用して追加しますが、別のレイアウトに変更すると消えたいが、removeHeaderView()は機能しません...リストビューからヘッダを削除

GONEに視認性を設定しても消えません

どうすればよいですか?事前

答えて

0

おかげであなたはaddHeaderViewを()を使用している場合は、あなたはその後にヘッダを削除することはできません。

したがって、addHeaderView()は使用しないでください。むしろ、 あなたのメインのリストをあなたのヘッダーとブレンドする独自のアダプターを作成してください。

https://github.com/commonsguy/cwac-merge

+0

あなたはヘッダを指すように変数を持っている場合は、このリンクを参照して、ヘッダビューを削除することができます。http://stackoverflow.com/a/39286390/1817569 – Hamid

48

下記のアプローチを試してみてください。..

アンドロイドListView#addHeaderViewListView#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); 

ヘッダーが表示されなくなりました。上の醜いスペースはもうありません!

+2

+1素晴らしい - 私 – Dori

+0

グレートのための素晴らしい作品仕事、全体のプロセスを説明するための素晴らしい方法。 –

+0

脳の余分な体重を持つ人 – Sayka

14

ほとんどの人は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で、ここで私は何をすべきかだ

+0

これは非常にうまくいきました。 –

1

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)); 
0

を私が遭遇しましたやや偽装されたシナリオでこの問題:私が扱っていた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); 
} 
3

を問題は、あなたが行うときは、常に新しいオブジェクトを作成しているということです。だから、

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); 
      } 
     } 
1

ヘッダ数> 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 
} 
関連する問題