2012-06-25 17 views
6

Mam niestandardowy adapter dla mojego ListView Chcę dodać nazwy projektów jako nagłówki do moich żądań pracy. Dodanie pojedynczego nagłówka działa dobrze, ale nie jestem pewien, jak dodać wiele nagłówków za pomocą addHeaderView. Nie rozumiem, gdzie dokładnie umieścić setAdapter lub czy ma on być umieszczony wiele razy?Jak dodać wiele widoków nagłówka w ListView

To jest mój kod Java na jeden cel, który działa:

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

Teraz dla dwóch nagłówków Próbowałem to:

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

Ale to nie działa! Daje mi tylko nagłówek projektu 2 i wszystkie 7 wpisów poniżej. Czy ktoś mógłby mi powiedzieć, co jest nie tak? Zgaduję, że ma to coś wspólnego z setAdapter. Dzięki!

Odpowiedz

11

Nie sądzę, że to, co chcesz zrobić, jest możliwe w taki sposób, w jaki próbujesz to zrobić. Gdy używasz addHeaderView, opakowuje twój ListAdapter w HeaderViewListAdapter. Spojrzałem na dokumenty dla niego here i to wydaje się sugerować, że możesz mieć wiele nagłówków, ale wszystkie byłyby na górze (duh, nagłówek).

Brzmi jak co rzeczywiście chcesz to separatory ...

Można użyć CommonWare's MergeAdapter. Pozwoli to wstawiać adaptery i widoki (w dowolnej kolejności) i prezentować je wszystkie jako pojedynczy adapter do widoku listy. Po prostu przekazujesz mu nagłówki i adaptery dla każdej sekcji zawartości, a następnie ustawiasz ją na liście.

przykład Pseudo-kod:

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

osiągnąłem wiele scenariusz nagłówka przy użyciu niestandardowych Section Adapter który pierwotnie oznaczonych przez CommonsWare można zrobić sekcję w listivew, jak książki, gry i itp sprawdź poniżej kodu.

Sekcja Adapter:

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

obrębie działalności zrobić Sekcji obiektu adaptera, sprawdź poniżej kodu:

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"--> 

obrębie działalności sekcja dodać tyle, ile chcesz, jak poniżej:

Uwaga: userPic & medPic to nazwa ArrayList.

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


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

listview.setAdapter(adapter); 
+0

Przeczytałem o tym. Chciałem wiedzieć, czy mógłbym to zrobić bez użycia 'MergeAdapter'. Okazuje się, że nie mogę. Dzięki – Harsh

0

Chciałbym rozwiązać ten problem z ExpandableListView. Nie wymaga żadnej dodatkowej biblioteki.

  • Utwórz niestandardową kartę.
  • Podaj swoje dane i wypełnij metody, które chcesz zastąpić.
  • Po ustawieniu zasilacza z ExpandableListView:
    • Zastąp groupItemClick więc klikając na grupy nie będzie właściwie rozwinąć widok.
    • Przeprowadź pętlę przez każdy element nadrzędny w adapterze i ustaw je rozszerzone.
Powiązane problemy