2013-08-11 10 views
10

Oldukça garip bir sorun yaşıyorum. Benim mantığım basit, benim uygulama ana uygulama navigasyon için bir NavigationDrawer kullanır ve mevcut seçeneklerin karmaşıklığı nedeniyle, bazı navigasyon öğeleri için bir ExpandableListViev kullanmak istiyorum.GenişletilebilirListView ve NavigationDrawer

Sorun? Basit: Çekmecenin üzerindeki yüklerin listesi; Ancak, çocukları göstermek için genişlemezler.

Soru Genişlemesinin bir nedeni var mı? Bunun için farklı bir UI widget'ı kullanmalı mıyım? Bazı Notlar

: Farklı Etkinliğini aynı kodu eklenmiş, ancak bunun yerine çekmecenin üzerinde ExpandableListViev barındırma, ben sadece unsur olarak basit LinearLayout eklendi vardı ve orada iyi çalışır . Faaliyet için

Benim Düzen:

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

<ExpandableListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@color/secondary_color_holo"/> 

</android.support.v4.widget.DrawerLayout> 

Etkinlik kodu:

private DrawerLayout mDrawerLayout; 
private ExpandableListView mDrawerList; 
private ExpandableDrawerAdapter mDrawerAdapter; 

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

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ExpandableListView) findViewById(R.id.left_drawer); 
    // set up the drawer's list view with items and click listener 
    mDrawerAdapter = new ExpandableDrawerAdapter(this); 
    mDrawerList.setAdapter(mDrawerAdapter); 
    mDrawerList.setOnGroupClickListener(new DrawerGroupClickListener()); 
    mDrawerList.setOnChildClickListener(new DrawerChildClickListener()); 
} 

Ve nihayet çok basit adaptör:

public class ExpandableDrawerAdapter extends BaseExpandableListAdapter { 

private static final int CAMPAIGNS = 0; 
private static final int CONVERSIONS = 1; 
private static final int MYACCOUNT = 2; 

private LayoutInflater mInflater; 
private String[] mainNavItems, campaignNavItems, myAccountNavItems; 

public ExpandableDrawerAdapter (Activity context) { 
    this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.mainNavItems = context.getResources().getStringArray(R.array.main_nav_items); 
    this.campaignNavItems = context.getResources().getStringArray(R.array.campaigns_nav_items); 
    this.myAccountNavItems = context.getResources().getStringArray(R.array.my_account_nav_items); 
} 

public Object getChild(int groupPosition, int childPosition) { 

    switch (groupPosition) { 
     case CAMPAIGNS: 
      return campaignNavItems[childPosition]; 
     case MYACCOUNT: 
      return myAccountNavItems[childPosition]; 
     default: 
      return ""; 
    } 
} 

public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.drawer_child_list_item, null); 
    } 

    TextView childText = (TextView) convertView.findViewById(R.id.drawer_child_list_item_text); 
    childText.setText((String) getChild(groupPosition, childPosition)); 

    return convertView; 
} 

public int getChildrenCount(int groupPosition) { 
    switch (groupPosition) { 
     case CAMPAIGNS: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + campaignNavItems.length); 
      return campaignNavItems.length; 
     case CONVERSIONS: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + 0); 
      return 0; 
     case MYACCOUNT: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + myAccountNavItems.length); 
      return myAccountNavItems.length; 
     default: 
      return 0; 
    } 
} 

public Object getGroup(int groupPosition) { 
    return mainNavItems[groupPosition]; 
} 

public int getGroupCount() { 
    return mainNavItems.length; 
} 

public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

public View getGroupView(int groupPosition, boolean isExpanded, 
         View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.drawer_list_item, 
       null); 
    } 

    TextView groupText = (TextView) convertView.findViewById(R.id.drawer_list_item_text); 
    groupText.setText((String) getGroup(groupPosition)); 
    return convertView; 
} 

public boolean hasStableIds() { 
    return true; 
} 

public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 
} 
+1

Çocuklar için bu dizilerde değerleriniz varsa (ki sanırım sizde var :)). "ExpandableListView" öğesinde bir "OnGroupClickListener" ayarladığınızı görüyorum. Umarım bu dinleyicinin onGroupClick() 'geri çağrısından 'false' döndürürsünüz demektir. Aksi takdirde, bir dönüş değeriyle birlikte daraltma/genişletme etkinliğini engellersiniz. 'true' (yani, etkinliği zaten ele aldığınız için başka hiçbir işlem gerekli değildir). – Luksprog

+0

Hmm, belgeler, gerçekleri geri döndürmenin varsayılan daraltmayı ve genişletmeyi engelleyeceği konusunda çok açık hale getirmez. Çekmecenin dışına aynı mantığa sahip olduğum için garipti ve iyi çalıştı. O zamanlar evde yokum, ama her iki dinleyiciye doğru geri döndüğümden emin olmak istediğim sorun benim için doğru çözüm gibi geliyor. İsterseniz devam edin ve cevap olarak gönderin, eve döndüğümde ve yanlış döndüğümde cevabınızı kabul edebilirim. –

+0

Her bir öğe genişler/sözleşme yapar mı? Ya da genişleyen ve basit tıklanabilir öğeler olan diğerleri var mı? – AlleyOOP

cevap

16

benim yorumunda söylediği gibi, yapmak false'u 'dan döndürdüğünüze göre ExpandableListView Dinleyicinin onGroupClick() geri çağrısından true döndürürseniz, bu olay considered handled olayı olduğunda daraltma/genişletme eylemini engeller.

+1

Evet, bu iyi çalıştı. Teşekkürler! –

İlgili konular