2012-06-25 17 views
6

Tengo un adaptador personalizado para mi ListView Quiero agregar nombres de proyectos como los encabezados de mis solicitudes de trabajo. Agregar un único encabezado funciona bien, pero no estoy seguro de cómo agregar varios encabezados usando addHeaderView. No entiendo exactamente dónde colocar setAdapter o se supone que debe colocarse varias veces?Cómo agregar varias vistas de encabezado en un ListView

Este es mi código java para una única cabecera que funciona:

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

Ahora, por dos cabeceras He intentado esto:

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

Pero esto no funciona! Solo me da el encabezado del Proyecto 2 y las 7 entradas debajo de él. ¿Alguien podría decirme qué pasa? Supongo que tiene algo que ver con setAdapter. ¡Gracias!

Respuesta

11

No creo que lo que quieres hacer es posible la forma en que intentas hacerlo. Cuando usa addHeaderView, envuelve su ListAdapter en HeaderViewListAdapter. Miré los documentos para él here y eso parece implicar que podría tener múltiples encabezados, pero todos estarían en la parte superior (duh, encabezado).

Suena como lo que realmente quiere es seperators ...

Usted podría utilizar CommonWare's MergeAdapter. Le permitirá insertar adaptadores y vistas (en el orden que desee) y presentarlos como un único adaptador a una vista de lista. Simplemente le entrega los encabezados y adaptadores para cada sección de contenido y luego lo establece en su lista.

ejemplo Pseudo-código:

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

que logra escenario múltiple utilizando cabecera personalizada Section Adapter que está codificado originalmente por CommonsWare, se puede hacer dentro de la sección listivew, como libros, juegos y etc comprobar a continuación código.

Sección adaptador:

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

Dentro de la actividad hacen Sección objeto adaptador, comprobar a continuación Código:

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

Dentro actividad Añadir sección como todas las que quieras, como a continuación:

Nota: UserPic & medPic son nombre de ArrayList.

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


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

listview.setAdapter(adapter); 
+0

Lo he leído sobre él. Quería saber si podría hacerlo sin usar 'MergeAdapter'. Resulta que no puedo. Gracias – Harsh

0

Resolvería este problema con ExpandableListView. No requiere ninguna biblioteca adicional.

  • Crea tu adaptador personalizado.
  • Proporcione sus datos y complete los métodos que necesita para anular.
  • Después de configurar el adaptador con ExpandableListView:
    • Anulación groupItemClick así que hacer clic en los grupos será en realidad no expandir la vista.
    • Pasa por cada uno de los padres en el adaptador y configúralo expandido.
Cuestiones relacionadas