2012-06-25 29 views
6

私のカスタムアダプターを持っていますListView作業要求のヘッダーとしてプロジェクト名を追加したいと思います。単一のヘッダーを追加するだけでうまく動作しますが、私はaddHeaderViewを使って複数のヘッダーを追加する方法がわかりません。私は正確にどこにsetAdapterを配置するか、それは複数回置くことになっているのか分かりませんか?ListViewに複数のヘッダービューを追加する方法

これが機能する単一のヘッダのための私のJavaコードです:しかし、これは動作しません

mListView = (ListView)findViewById(R.id.dashboardList); 
View header1 = getLayoutInflater().inflate(R.layout.listview_header, null, false); 
tv = (TextView) header1.findViewById(R.id.listHeader); 
adapter = new MyCustomAdapter(MyDashboardActivity.this, R.layout.mydashboard_row, dashboardBean); 
tv.setText("RxOffice"); 
mListView.addHeaderView(header1, null, false); 
for (int i=0; i < 4; i++) { 
    dashboardBean.add(new DashboardBean(workRequests[i],status[i],actualHours[i])); 
} 

tv.setText(Project 2"); 

mListView.addHeaderView(header1, null, false); 
for (int i=4; i < workRequests.length; i++) { 
    dashboardBean.add(new DashboardBean(workRequests[i],status[i],actualHours[i])); 
} 
mListView.setAdapter(adapter); 

mListView = (ListView)findViewById(R.id.dashboardList); 
View header1 = getLayoutInflater().inflate(R.layout.listview_header, null, false); 
tv = (TextView) header1.findViewById(R.id.listHeader); 
adapter = new MyCustomAdapter(MyDashboardActivity.this, R.layout.mydashboard_row, dashboardBean); 
tv.setText("Project 1"); 
mListView.addHeaderView(header1, null, false); 
for (int i=0; i < 7; i++) { 
    dashboardBean.add(new DashboardBean(workRequests[i],status[i],actualHours[i])); 
} 
mListView.setAdapter(adapter); 

を今、私は2つのヘッダのために、私はこれを試してみました!それは私にプロジェクト2ヘッダーとその下の7つのエントリだけを与えます。誰でも何が間違っているか教えてもらえますか?私はそれがsetAdapterと関係があると推測しています。ありがとう!

答えて

11

あなたがしたいことは、あなたがやろうとしている方法ではないと思います。 addHeaderViewを使用すると、にListAdapterがラップされます。私はそれのためのドキュメントを見てhereとそれはあなたが複数のヘッダーを持つことができることを暗示しているようだが、彼らはすべてトップ(duh、ヘッダー)になるだろう。

それはあなたが実際にseperatorsで欲しいもののように聞こえる...

あなたはCommonWare's MergeAdapterを使用することができます。アダプターとビューを(あなたが望む順序で)挿入し、それらをすべて単一のアダプターとしてリストビューに提示することができます。コンテンツの各セクションのヘッダーとアダプターを渡してリストに設定するだけです。

擬似コードの例:

myMergeAdapter = new MergeAdapter(); 
myMergeAdapter.addView(HeaderView1); 
myMergeAdapter.addAdapter(listAdapter1); 
myMergeAdapter.addView(HeaderView2); 
myMergeAdapter.addAdapter(listAdapter2); 
setListAdapter(myMergeAdapter); 
2

私はもともとCommonsWareで符号化されたカスタムSection Adapterを使用して、複数のヘッダのシナリオを達成等の書籍、ゲームとは、コードの下にチェックアウトするように、あなたは、listivew内のセクションを作ることができます。

セクションアダプタ:アクティビティ内

package com.medplan.db; 

import java.util.ArrayList; 
import java.util.List; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Adapter; 
import android.widget.BaseAdapter; 




abstract public class SectionedAdapter extends BaseAdapter { 

    String TAG = "========SectionedAdapter============"; 

abstract protected View getHeaderView(String caption, 
             int index, 
             View convertView, 
             ViewGroup parent); 

private List<Section> sections=new ArrayList<Section>(); 
private static int TYPE_SECTION_HEADER=0; 

public SectionedAdapter() { 
    super(); 
    sections.clear(); 


} 

public void addSection(String caption, Adapter adapter) { 

    sections.add(new Section(caption, adapter)); 
} 


public void clear() { 

    sections.clear(); 
    notifyDataSetChanged(); 
} 


public Object getItem(int position) { 
    for (Section section : this.sections) { 
    if (position==0) { 
     return(section); 
    } 

    int size=section.adapter.getCount()+1; 

    if (position<size) { 
     return(section.adapter.getItem(position-1)); 
    } 

    position-=size; 
    } 

    return(null); 
} 

public int getCount() { 
    int total=0; 

    for (Section section : this.sections) { 
    total+=section.adapter.getCount()+1; // add one for header 
    } 

    return(total); 
} 

public int getViewTypeCount() { 
    int total=1; // one for the header, plus those from sections 

    for (Section section : this.sections) { 
    total+=section.adapter.getViewTypeCount(); 
    } 

    return(total); 
} 

public int getItemViewType(int position) { 
    int typeOffset=TYPE_SECTION_HEADER+1; // start counting from here 

    for (Section section : this.sections) { 
    if (position==0) { 
     return(TYPE_SECTION_HEADER); 
    } 

    int size=section.adapter.getCount()+1; 

    if (position<size) { 
     return(typeOffset+section.adapter.getItemViewType(position-1)); 
    } 

    position-=size; 
    typeOffset+=section.adapter.getViewTypeCount(); 
    } 

    return(-1); 
} 

public boolean areAllItemsSelectable() { 
    return(false); 
} 

public boolean isEnabled(int position) { 
    return(getItemViewType(position)!=TYPE_SECTION_HEADER); 
} 

public View getView(int position, View convertView, 
        ViewGroup parent) { 
    int sectionIndex=0; 

    for (Section section : this.sections) { 
    if (position==0) { 
     return(getHeaderView(section.caption, sectionIndex, 
          convertView, parent)); 
    } 

    int size=section.adapter.getCount()+1; 

    if (position<size) { 
     return(section.adapter.getView(position-1,convertView,parent)); 
    } 

    position-=size; 
    sectionIndex++; 
    } 

    return(null); 
} 

public long getItemId(int position) { 
    return(position); 
} 

class Section { 
    String caption = null; 
    Adapter adapter = null; 

    Section(String caption, Adapter adapter) { 
    this.caption=caption; 
    this.adapter=adapter; 
    } 
} 
} 

は、セクションのアダプタオブジェクトを作成し、コードの下にチェックアウト:

final SectionedAdapter adapter =new SectionedAdapter() 
       { 

         protected View getHeaderView(String caption, int index, View convertView,ViewGroup parent) 
         { 

         result=(TextView)convertView; 

         if (convertView==null) 
         { 
          result=(TextView)getLayoutInflater().inflate(R.layout.section_header,null); 

         } 

         result.setText(caption); 
         // temp=caption; 
         // ind=index; 

         return(result); 
         } 
        }; 

section_header.xml

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/black" 
    android:textColor="#FFFFFF" 
    android:ellipsize="end" 
    android:textSize="11sp" 
    style="?android:attr/listSeparatorTextViewStyle" /> 


<!-- android:background="#515050"--> 
012活動の中で

を使用すると、以下のように好きなだけのセクションを追加します。

注:userPic & medPicのArrayListの名前です。

adapter.addSection("section first", new EfficientAdapter(getApplicationContext(),usersPic)); 


adapter.addSection("section second", new EfficientAdapter(getApplicationContext(),medPic)); 

listview.setAdapter(adapter); 
+0

私はそれについて読んだ。私は 'MergeAdapter'を使わずにできるかどうかを知りたかったのです。私はできません。ありがとう – Harsh

0

私はこの問題をExpandableListViewで解決します。それは余分なライブラリを必要としません。

  • カスタムアダプターを作成します。
  • データを与え、上書きする必要のある方法を記入してください。 ExpandableListViewでアダプタを設定した後
    • オーバーライドgroupItemClickので、グループをクリックすると、実際にビューを展開しません。
    • アダプタ内のすべての親をループし、それらを展開します。
関連する問題