2013-08-11 50 views
10

Tôi gặp vấn đề khá lạ. Logic của tôi rất đơn giản, ứng dụng của tôi sử dụng NavigationDrawer để điều hướng ứng dụng chính và do sự phức tạp của các tùy chọn có sẵn, tôi muốn sử dụng một số ExpandableListViev để lồng một số mục điều hướng.ExpandableListView và NavigationDrawer

Sự cố? Đơn giản quá: Danh sách các mục tải trên ngăn kéo; tuy nhiên, họ không mở rộng để cho các em thấy.

Câu hỏi Có lý do nào không mở rộng không? Tôi có nên sử dụng tiện ích con giao diện người dùng khác cho điều này không?

Một vài chú ý: Tôi thêm cùng mã trên Hoạt động khác nhau, nhưng thay vì lưu trữ các ExpandableListViev vào ngăn kéo, tôi đã có nó gia tăng đối với một đơn giản LinearLayout là yếu tố duy nhất, và nó không làm việc tốt có .

My Layout cho Hoạt động:

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

Mã Hoạt động:

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

Và cuối cùng là một bộ chuyển đổi rất đơn giản:

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

Câu hỏi hiển nhiên sẽ là nếu bạn có giá trị trong các mảng đó cho trẻ em (mà tôi đoán bạn có :)). Tôi thấy rằng bạn thiết lập một 'OnGroupClickListener' trên' ExpandableListView' của mình, tôi hy vọng bạn trả về 'false' từ' onGroupClick() 'callback của trình lắng nghe đó nếu không bạn sẽ chặn sự kiện thu gọn/mở rộng với giá trị trả về của 'true' (nghĩa là bạn đã xử lý sự kiện nên không cần thực hiện các hành động nào khác). – Luksprog

+0

Hmm, tài liệu không làm cho quá rõ ràng rằng trả về true sẽ chặn việc thu gọn và mở rộng mặc định. Cũng lạ khi tôi có cùng một logic được áp dụng bên ngoài ngăn kéo và nó hoạt động tốt. Tôi không ở nhà vào thời điểm đó, nhưng điều đó chắc chắn giống như giải pháp đúng cho vấn đề của tôi, kể từ khi tôi trở lại đúng trên cả hai người nghe. Nếu bạn muốn, hãy tiếp tục và đăng nó như là một câu trả lời, và một khi tôi về nhà và kiểm tra trở về sai tôi có thể chấp nhận câu trả lời của bạn. –

+0

Mỗi mục có mở rộng/hợp đồng không? Hoặc bạn có một số mở rộng và những người khác vẫn duy trì các mục có thể nhấp đơn giản không? – AlleyOOP

Trả lời

16

Như tôi đã nói trong nhận xét của tôi, làm cho chắc chắn rằng bạn trả lại false từ số DrawerGroupClickListener mà bạn đã đặt trên ExpandableListView. Nếu bạn trả lại true từ số gọi lại onGroupClick() của người nghe, thao tác này sẽ chặn hành động thu gọn/mở rộng khi sự kiện là considered handled.

+1

Vâng, điều đó hoạt động tốt. Cảm ơn! –