2013-06-07 2 views
15

Ho creato un progetto con il nuovo oggetto di navigazione Oggetto.Cassetto di navigazione: aggiungi le intestazioni in listview

Vorrei personalizzare il layout del menu, per aggiungere un altro oggetto come TextView, ImageView ... E per cominciare, vorrei modificare il layout predefinito che è composto solo con una listview, aggiungendo 2 o 3 intestazioni nella listview.

Oggi, ho provato a utilizzare "addHeaderView" ma penso che sia possibile utilizzarlo solo per aggiungere un'intestazione.

Come posso aggiungere un'intestazione e personalizzare davvero il menu di layout? Perché, dall'API dello sviluppatore, sembra che solo due bambini siano autorizzati con un "android.support.v4.widget.DrawerLayout".

Ecco una cattura di mio layout oggi:

Navigation Drawer Headers in listview

E qui è una cattura che voglio creare:

Navigation Drawer Headers in listview

Ecco un pezzo di codice del mio MainAttività:

public class MainActivity extends Activity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mPlanetTitles; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mTitle = mDrawerTitle = getTitle(); 
    mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    // Declaration of the 2 listview's 
    mDrawerList = (ListView) findViewById(R.id.dernieres_news); 

    LayoutInflater inflater = getLayoutInflater(); 

    // Add header news title 
    ViewGroup header_news = (ViewGroup)inflater.inflate(R.layout.header_dernieres_news, mDrawerList, false); 
    mDrawerList.addHeaderView(header_news, null, false); 

    // set a custom shadow that overlays the main content when the drawer opens 
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    String[] names=new String[]{"Title 1", "Title 2", "Title 3", "Title 4", "Title 5"}; 

    /*Array of Images*/ 
    int[] image = new int[] {R.drawable.ic_action_feed, R.drawable.ic_action_feed, R.drawable.ic_action_feed, R.drawable.ic_action_feed, R.drawable.ic_action_feed}; 

    List<HashMap<String, String>> listinfo = new ArrayList<HashMap<String, String>>(); 
    listinfo.clear(); 
    for(int i=0;i<5;i++){ 
     HashMap<String, String> hm = new HashMap<String, String>(); 
     hm.put("name", names[i]); 
     hm.put("image", Integer.toString(image[i])); 
     listinfo.add(hm); 
    } 

    // Keys used in Hashmap 
    String[] from = { "image", "name" }; 
    int[] to = { R.id.img, R.id.txt }; 
    SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), listinfo, R.layout.drawer_list_item, from, to); 
    mDrawerList.setAdapter(adapter); 

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    // ActionBarDrawerToggle ties together the the proper interactions 
    // between the sliding drawer and the action bar app icon 
    mDrawerToggle = new ActionBarDrawerToggle(
      this,     /* host Activity */ 
      mDrawerLayout,   /* DrawerLayout object */ 
      R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
      R.string.drawer_open, /* "open drawer" description for accessibility */ 
      R.string.drawer_close /* "close drawer" description for accessibility */ 
      ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     selectItem(0); 
    } 
} 

E il codice di activity_main.xml:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 


    <ListView 
     android:id="@+id/dernieres_news" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#F3F3F4" 
     android:choiceMode="singleChoice" 
     android:divider="#E3E9E3" 
     android:dividerHeight="1dp" /> 

+0

'int [] a = {R.id.img, R.id.txt};' Dove hai definito questo? – DroidLearner

risposta

8

Si potrebbe farlo nello stesso modo come si dovrebbe aggiungere intestazioni in qualsiasi altro ListView, insegnando la vostra ListAdapter per tornare righe di titolo così come righe di dettaglio . A livello basso, questo implica l'override di metodi come getViewTypeCount() e getItemViewType() nel tuo ListAdapter, oltre a getView() conoscere la differenza tra i tipi di riga. In alternativa, utilizzare un'implementazione di alto livello esistente come https://github.com/emilsjolander/StickyListHeaders o http://code.google.com/p/android-amazing-listview/ o uno degli altri trovati durante la ricerca di android listview headers.

+0

Quindi non è possibile utilizzare qualcos'altro rispetto a ListView? (Diciamo un layout con 3 pulsanti) –

+0

@ThomasDecaux: Ciò andrebbe contro le linee guida di progettazione. Non c'è niente che ti impedisca di inserire qualcosa (anche se 'SurfaceView' potrebbe essere un problema). – CommonsWare

+0

Hai ragione, grazie –

1

Sarà necessario creare una sottoclasse di BaseAdapter e utilizzarla al posto di SimpleAdapter in ListView.

Fornite l'adattatore con dati di riempimento, in cui i dati extra sono i titoli. I titoli e gli stessi listiti saranno membri della stessa classe comune. Quindi, nell'adattatore, decidi in base all'elemento dati se la vista effettiva è un titolo o un oggetto e gonfialo di conseguenza.

UPDATE:

Ecco un buon esempio di questo: http://w2davids.wordpress.com/android-sectioned-headers-in-listviews/

Questo separa realtà titoli da elementi di dati e utilizza convertView correttamente, a differenza della soluzione che ho usato finora nella mia app precedenti.

+0

Ok, grazie. Hai un campione che potrebbe aiutarmi? – wawanopoulos

+0

Aggiornato la mia risposta. – Herrbert74

8

Le altre risposte sono corrette.

Ho trovato un ottimo esempio di personalizzazione della vista per contenere due tipi di elementi: menu section e menu item. Ovviamente puoi cambiarlo per essere quello che vuoi.

L'esempio contiene anche un'implementazione di una classe di attività astratta che eredita da ogni attività con un cassetto nav.

http://www.michenux.net/android-navigation-drawer-748.html