2013-06-07 15 views
15

Utworzono projekt z nowym obiektem szuflady nawigacji.Szuflada nawigacji: dodaj nagłówki w widoku listy

Chciałbym dostosować układ menu, dodać kolejny obiekt, taki jak TextView, ImageView ... I na początek, chciałbym zmodyfikować domyślny układ, który składa się tylko z jednym widokiem listy, przez dodanie 2 lub 3 nagłówki w widoku listy.

Dzisiaj próbowałem użyć "addHeaderView", ale myślę, że można go użyć tylko do dodania jednego nagłówka.

Jak mogę zrobić, aby dodać nagłówek i naprawdę dostosować moje menu układu? Ponieważ z interfejsu API programistów wydaje się, że tylko dwoje dzieci ma pozwolenie w ramach "android.support.v4.widget.DrawerLayout".

Oto zrzut z mojego układu dzisiaj:

Navigation Drawer Headers in listview

I tu jest przechwytywanie że chcę utworzyć:

Navigation Drawer Headers in listview

Oto fragment kodu z moich MainActivity:

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

oraz Kodeks 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 [] = {do R.id.img, R.id.txt};' Gdzie to zdefiniowane? – DroidLearner

Odpowiedz

8

byłoby to zrobić w taki sam sposób, jak można dodać nagłówki w inny ListView, przez uczenie ListAdapter wrócić nagłówków wierszy, a także wiersze szczegółów . Na niskim poziomie obejmuje to nadpisywanie metod, takich jak getViewTypeCount() i w swoim ListAdapter, plus posiadające getView() znać różnicę między typami wierszy. Lub użyj istniejącej implementacji wysokiego poziomu, takiej jak https://github.com/emilsjolander/StickyListHeaders lub http://code.google.com/p/android-amazing-listview/ lub dowolnej innej znalezionej podczas wyszukiwania android listview headers.

+0

Więc nie możesz użyć czegoś innego niż ListView? (Powiedzmy, że układ z 3 przyciskami) –

+0

@ThomasDecaux: To byłoby niezgodne z wytycznymi projektowania. Nic nie stoi na przeszkodzie, aby coś tam wstawić (chociaż "SurfaceView" prawdopodobnie byłby problemem). – CommonsWare

+0

Masz rację, dziękuję –

1

Będziesz musiał dokonać podklasy BaseAdapter i użyć tego zamiast SimpleAdapter w ListView.

Dostarczasz adapterowi wypchane dane, gdzie dodatkowe dane to tytuły. Tytuły i listy same w sobie będą członkami tej samej wspólnej klasy. Następnie w adapterze decyduje się na podstawie danych, jeśli rzeczywisty widok jest tytułem lub elementem i odpowiednio go nadmuchuje.

UPDATE:

Tutaj jest dobrym przykładem: http://w2davids.wordpress.com/android-sectioned-headers-in-listviews/

To rzeczywiście rozdziela tytuły z danymi i używa convertView prawidłowo, w przeciwieństwie do rozwiązania użyłem tej pory w moich poprzednich aplikacjach.

+0

OK, dziękuję. Czy masz próbkę, która może mi pomóc? – wawanopoulos

+0

Zaktualizowałem moją odpowiedź. – Herrbert74

8

Inne odpowiedzi są poprawne.

Znalazłem naprawdę dobry przykład dostosowywania widoku, aby zawierał dwa typy elementów: Oczywiście możesz to zmienić tak, jak chcesz.

Przykład zawiera również implementację abstrakcyjnej klasy aktywności, z której dziedziczy każde działanie z szufladą nav.

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

Powiązane problemy