2013-06-07 12 views
15

मैंने नए नेविगेशन ड्रॉवर ऑब्जेक्ट के साथ एक प्रोजेक्ट बनाया है।नेविगेशन ड्रॉवर: सूचीदृश्य में शीर्षलेख जोड़ें

मैं टेक्स्टव्यू, छवि दृश्य जैसे अन्य ऑब्जेक्ट को जोड़ने के लिए मेनू के लेआउट को कस्टमाइज़ करना चाहता हूं ... और शुरुआत के लिए, मैं डिफ़ॉल्ट लेआउट को संशोधित करना चाहता हूं जो केवल एक सूचीदृश्य के साथ बनाया गया है, 2 या दो जोड़कर, सूचीदृश्य में 3 शीर्षलेख।

आज, मैंने "addHeaderView" का उपयोग करने का प्रयास किया है, लेकिन मुझे लगता है कि इसे केवल एक शीर्षलेख जोड़ने के लिए उपयोग करना संभव है।

मैं हेडर जोड़ने और वास्तव में अपने लेआउट मेनू को कस्टमाइज़ करने के लिए कैसे कर सकता हूं? क्योंकि, डेवलपर एपीआई से, ऐसा लगता है कि केवल दो बच्चों को "android.support.v4.widget.DrawerLayout" के अंतर्गत परमिट है।

Navigation Drawer Headers in listview

यहाँ और एक पर कब्जा है कि मैं बनाना चाहते है:

यहाँ मेरी लेआउट का एक पर कब्जा आज

Navigation Drawer Headers in listview

यहाँ के कोड का एक टुकड़ा है मेरी मुख्य गतिविधि:

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

और 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 [] करने के लिए = {R.id.img, R.id.txt};' कहाँ आप इस परिभाषित किया? – DroidLearner

उत्तर

8

आपको लगता है कि एक ही तरह से आप किसी भी अन्य ListView में शीर्षकों जोड़ना होगा के रूप में, अपने ListAdapter शिक्षण शीर्षक पंक्तियों के साथ-साथ विस्तार पंक्तियों को वापस करने के लिए से करना होगा । निम्न स्तर पर, इसमें getViewTypeCount() और getItemViewType() जैसे ListAdapter में ओवरराइडिंग विधियां शामिल हैं, साथ ही getView() पंक्ति प्रकारों के बीच अंतर को जानती है। या, की खोज करते समय https://github.com/emilsjolander/StickyListHeaders या http://code.google.com/p/android-amazing-listview/ या अन्य किसी भी अन्य उच्च स्तर के कार्यान्वयन का उपयोग करें।

+0

तो आप ListView से कुछ और उपयोग नहीं कर सकते हैं? (मान लें कि 3 बटन के साथ एक लेआउट) –

+0

@ थॉमस डेकॉक्स: यह डिज़ाइन दिशानिर्देशों के खिलाफ होगा। वहां कुछ भी डालने से आपको रोक नहीं है (हालांकि 'SurfaceView' एक समस्या होगी)। – CommonsWare

+0

आप सही, धन्यवाद –

1

आपको बेसएडाप्टर को उपclass करना होगा और ListView में SimpleAdapter के बजाय इसका उपयोग करना होगा।

आप भरे हुए डेटा के साथ एडाप्टर की आपूर्ति करते हैं, जहां अतिरिक्त डेटा शीर्षक है। खिताब और सूचीकरण स्वयं एक ही आम वर्ग के सदस्य होंगे। फिर एडाप्टर में आप डेटा आइटम के आधार पर निर्णय लेते हैं यदि वास्तविक दृश्य शीर्षक या वस्तु है और तदनुसार इसे फुलाएं।

अद्यतन:

यहाँ इस का एक अच्छा उदाहरण है: http://w2davids.wordpress.com/android-sectioned-headers-in-listviews/

यह वास्तव में डेटा आइटम से खिताब अलग करती है और समाधान मैं अब तक अपने पिछले ऐप्लिकेशन में उपयोग के विपरीत, सही ढंग से convertView उपयोग करता है।

+0

ठीक है, धन्यवाद। क्या आप एक नमूना है जो मेरी मदद कर सकता है? – wawanopoulos

+0

मेरा जवाब अपडेट किया गया। – Herrbert74

8

अन्य उत्तरों सही हैं।

मुझे दो प्रकार के आइटम रखने के लिए दृश्य को अनुकूलित करने का एक अच्छा उदाहरण मिला है: menu section और menu item। बेशक आप इसे जो कुछ भी चाहते हैं उसे बदल सकते हैं।

उदाहरण में एक अमूर्त गतिविधि वर्ग का कार्यान्वयन भी शामिल है जो एक नौसेना के दराज के साथ हर गतिविधि को प्राप्त करता है।

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

संबंधित मुद्दे