web-dev-qa-db-ja.com

listViewからヘッダーを削除します

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

私も可視性をGONEに設定してみましたが、消えません...

私に何ができる?

前もって感謝します

23
hasiertxo

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

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

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

52

ほとんどの人はAddHeaderViewの使用を好みませんが、複雑なアダプタの変更を回避したり、ヘッダーがそれらにあまり関連していない場合に、非常に便利であると感じることがあります。

この簡単なトリックでシームレスにヘッダーを削除/追加

空のLinearLayoutorientation 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

あなたはアイデアを得る....それが役に立てば幸い!

17
rupps

問題は、次の場合に常に新しいオブジェクトを作成することです。

 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);
            }
        }
4
sagits

ヘッダー数> 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
 }
3
Hamid

ここで、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));
1
kunmi

少し変装したシナリオでこの問題が発生しました。私が扱っていた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);
}
_
0
Alex Cohn

AddHeaderView()を使用している場合、その後ヘッダーを削除することはできません。

そのため、addHeaderView()は使用しないでください。むしろ、ビューの主な名簿をヘッダーとブレンドする独自のアダプターを作成します。私のMergeAdapterは特定のケースを処理しませんが、それを使用して複数の行ソースをブレンドする概念を確認できます。

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

0
Miloš