2012-06-25 15 views
6

Ho un adattatore personalizzato per il mio ListView Desidero aggiungere nomi di progetto come intestazioni alle mie richieste di lavoro. L'aggiunta di una singola intestazione funziona correttamente, ma non sono sicuro di come aggiungere più intestazioni utilizzando addHeaderView. Non capisco esattamente dove posizionare setAdapter o si suppone che venga inserito più volte?Come aggiungere più visualizzazioni di intestazione in un ListView

Questo è il mio codice java per un singolo colpo di testa che funziona:

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

Ora, io per due intestazioni ho provato questo:

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

Ma questo non funziona! Mi dà solo l'intestazione Project 2 e tutte le 7 voci sottostanti. Qualcuno potrebbe dirmi cosa c'è che non va? Immagino che abbia qualcosa a che fare con setAdapter. Grazie!

risposta

11

Non penso che quello che vuoi fare sia possibile nel modo in cui stai provando a farlo. Quando si utilizza addHeaderView, esso viene avvolto con lo ListAdapter in HeaderViewListAdapter. Ho guardato i documenti per questo here e questo sembra implicare che potresti avere più intestazioni, ma sarebbero tutte in cima (duh, intestazione).

Sembra che ciò che si vuole in realtà è seperators ...

Si potrebbe utilizzare CommonWare's MergeAdapter. Ti permetterà di inserire adattatori e viste (nell'ordine che desideri) e di presentarli tutti come un unico adattatore ad un listview. Devi semplicemente distribuire le intestazioni e gli adattatori per ogni sezione di contenuti e quindi impostarlo sulla tua lista.

pseudo-codice di esempio:

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

ho raggiunto multipla scenario intestazione utilizzando personalizzato Section Adapter che è originariamente codificata da CommonsWare, è possibile effettuare sezione all'interno listivew, come libri, giochi e ecc controllare sotto il codice.

adattatore Sezione:

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

Entro attività fanno Sezione adattatore oggetto, controllare qui di seguito il codice:

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

All'interno Activity Aggiungi sezione come molti come si desidera come di seguito:

Nota: Userpic & medPic sono nome arraylist.

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


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

listview.setAdapter(adapter); 
+0

Avevo letto a riguardo. Volevo sapere se potevo farlo senza usare 'MergeAdapter'. Risulta che non posso. Grazie – Harsh

0

Vorrei risolvere questo problema con ExpandableListView. Non richiede alcuna libreria aggiuntiva.

  • Crea il tuo adattatore personalizzato.
  • Fornisci i tuoi dati e riempi i metodi necessari per eseguire l'override.
  • Dopo aver impostato l'adattatore con ExpandableListView:
    • Override groupItemClick così cliccando sui gruppi saranno in realtà non espandere la vista.
    • Passa in rassegna ogni genitore in adattatore e li imposta espanso.
Problemi correlati