【问题标题】:how to add expandable listview inside material design navigation drawer in android?如何在 android 的材料设计导航抽屉内添加可扩展列表视图?
【发布时间】:2015-11-19 13:25:14
【问题描述】:

我想在 android 的 Material Design 导航抽屉中添加可扩展的列表视图?喜欢这个应用程序https://play.google.com/store/apps/details?id=com.rarlab.rar

【问题讨论】:

    标签: android


    【解决方案1】:

    ExpandablelistViewActivity.java:

    /**********Expandable Listview Inside Navigation Drawer************/
    
    
    
    import java.util.ArrayList; 
    import java.util.HashMap;
    import java.util.List; 
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.widget.DrawerLayout;
    import android.view.View;
    import android.widget.ExpandableListView;
    import android.widget.ExpandableListView.OnChildClickListener; 
    import android.widget.ExpandableListView.OnGroupClickListener; 
    import android.widget.ExpandableListView.OnGroupCollapseListener; 
    import android.widget.ExpandableListView.OnGroupExpandListener;
    import android.widget.FrameLayout; 
    import android.widget.Toast;
    
    
    public class ExpandablelistViewActivity extends Activity {
    
        private DrawerLayout mDrawerLayout;
        FrameLayout actContent;
        ExpandableListAdapter listAdapter;
        ExpandableListView expListView;
        List<String> listDataHeader;
        HashMap<String, List<String>> listDataChild;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_expandablelist_view);
    
            /************* ExpandableListView **********/
    
            expListView = (ExpandableListView) findViewById(R.id.lvExp);
            mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
            prepareListData();
            listAdapter = new ExpandableListAdapter(
                    ExpandablelistViewActivity.this, listDataHeader, listDataChild);
    
            expListView.setAdapter(listAdapter);
            //expandAll();
            // Listview Group click listener
            expListView.setOnGroupClickListener(new OnGroupClickListener() {
    
                @Override
                public boolean onGroupClick(ExpandableListView parent, View v,
                        int groupPosition, long id) {
                //  mDrawerLayout.closeDrawers();
                    // Toast.makeText(getApplicationContext(),
                    // "Group Clicked " + listDataHeader.get(groupPosition),
                    // Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
    
            // Listview Group expanded listener
            expListView.setOnGroupExpandListener(new OnGroupExpandListener() {
    
                @Override
                public void onGroupExpand(int groupPosition) {
                //  mDrawerLayout.closeDrawers();
                    /*Toast.makeText(getApplicationContext(),
                            listDataHeader.get(groupPosition) + " Expanded",
                            Toast.LENGTH_SHORT).show();*/
                }
            });
    
            // Listview Group collasped listener
            expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
    
                @Override
                public void onGroupCollapse(int groupPosition) {
                    mDrawerLayout.closeDrawers();
                    Toast.makeText(getApplicationContext(),
                            listDataHeader.get(groupPosition) + " Collapsed",
                            Toast.LENGTH_SHORT).show();
    
                }
            });
    
            // Listview on child click listener
            expListView.setOnChildClickListener(new OnChildClickListener() {
    
                @Override
                public boolean onChildClick(ExpandableListView parent, View v,
                        int groupPosition, int childPosition, long id) {
                    mDrawerLayout.closeDrawers();
                    // TODO Auto-generated method stub
                    Toast.makeText(
                            getApplicationContext(),
                            listDataHeader.get(groupPosition)
                                    + " : "
                                    + listDataChild.get(
                                            listDataHeader.get(groupPosition)).get(
                                            childPosition), Toast.LENGTH_SHORT)
                            .show();
                    return false;
                }
            });
        }
    
        // method to expand all groups
        private void expandAll() {
            int count = listAdapter.getGroupCount();
            for (int i = 0; i < count; i++) {
                expListView.expandGroup(i);
            }
        }
    
    
        /*
         * Preparing the list data
         */
        private void prepareListData() {
            listDataHeader = new ArrayList<String>();
            listDataChild = new HashMap<String, List<String>>();
    
            // Adding child data
            listDataHeader.add("Top 250");
            listDataHeader.add("Now Showing");
            listDataHeader.add("Coming Soon..");
    
            // Adding child data
            List<String> top250 = new ArrayList<String>();
            top250.add("The Shawshank Redemption");
            top250.add("The Godfather");
            top250.add("The Godfather: Part II");
            top250.add("Pulp Fiction");
            top250.add("The Good, the Bad and the Ugly");
            top250.add("The Dark Knight");
            top250.add("12 Angry Men");
    
            List<String> nowShowing = new ArrayList<String>();
            nowShowing.add("The Conjuring");
            nowShowing.add("Despicable Me 2");
            nowShowing.add("Turbo");
            nowShowing.add("Grown Ups 2");
            nowShowing.add("Red 2");
            nowShowing.add("The Wolverine");
    
            List<String> comingSoon = new ArrayList<String>();
            comingSoon.add("2 Guns");
            comingSoon.add("The Smurfs 2");
            comingSoon.add("The Spectacular Now");
            comingSoon.add("The Canyons");
            comingSoon.add("Europa Report");
    
            listDataChild.put(listDataHeader.get(0), top250); // Header, Child data
            listDataChild.put(listDataHeader.get(1), nowShowing);
            listDataChild.put(listDataHeader.get(2), comingSoon);
        }
    }
    

    ExpandablelistViewActivity 布局 ::

    /*********************ExpandablelistViewActivity Layout *****************************************/
    
     <LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@drawable/tropical"
       tools:context="com.example.localization.ExpandablelistViewActivity" >
    
        <android.support.v4.widget.DrawerLayout
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
            <!-- Listview to display slider menu -->
    
            <ExpandableListView
                android:id="@+id/lvExp"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"
                android:divider="@color/list_divider"
                android:dividerHeight="1dp" />
    
        </android.support.v4.widget.DrawerLayout>
    
    </LinearLayout>
    

    ExpandableListAdapter.java:

    /****************************ExpandableListAdapter*******************************************/
    
    
    import java.util.HashMap;
    import java.util.List;
    import android.content.Context;
    import android.graphics.Typeface;
    import android.view.LayoutInflater; 
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.TextView;
    
    public class ExpandableListAdapter extends BaseExpandableListAdapter {
    
        private Context _context;
        private List<String> _listDataHeader; // header titles
        // child data in format of header title, child title
        private HashMap<String, List<String>> _listDataChild;
        public ExpandableListAdapter(Context context, List<String> listDataHeader,
                HashMap<String, List<String>> listChildData) {
            this._context = context;
            this._listDataHeader = listDataHeader;
            this._listDataChild = listChildData;
        }
    
        @Override
        public Object getChild(int groupPosition, int childPosititon) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .get(childPosititon);
        }
    
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
    
        @Override
        public View getChildView(int groupPosition, final int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
    
            final String childText = (String) getChild(groupPosition, childPosition);
    
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_item, null);
            }
    
            TextView txtListChild = (TextView) convertView
                    .findViewById(R.id.lblListItem);
    
            txtListChild.setText(childText);
            return convertView;
        }
    
        @Override
        public int getChildrenCount(int groupPosition) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .size();
        }
    
        @Override
        public Object getGroup(int groupPosition) {
            return this._listDataHeader.get(groupPosition);
        }
    
        @Override
        public int getGroupCount() {
            return this._listDataHeader.size();
        }
    
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }
    
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            String headerTitle = (String) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_group, null);
            }
    
            TextView lblListHeader = (TextView) convertView
                    .findViewById(R.id.lblListHeader);
          //  lblListHeader.setTypeface(null, Typeface.BOLD);
            lblListHeader.setText(headerTitle);
    
            return convertView;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
    

    list_group 布局:

    /*********************    list_group layout*****************************/
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="8dp" >
    
        <TextView
    
            android:id="@+id/lblListHeader"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"      android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
            android:textColor="@color/black"
            android:textSize="17dp" />
    
    
    </LinearLayout>
    

    list_item 布局:

    /*********************   list_item layout*****************************/
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
     android:layout_height="55dip"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/lblListItem"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="17dip"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:textColor="@color/black"
            android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />
    
    < / LinearLayout>
    

    【讨论】:

      【解决方案2】:

      您可以使用 DrawerLayout 并在其中使用 AnimatedExpandableListView here

      例子:

      <FrameLayout
          android:id="@+id/content_frame"
          android:layout_width="match_parent"
          android:layout_height="match_parent"></FrameLayout>
      
      <AnimatedExpandableListView
          android:id="@+id/left_drawer_user_courses"
          android:layout_width="match_parent"
      
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:background="@color/side_menu_color"
          android:choiceMode="singleChoice"
          android:divider="@drawable/line_bettwen_courses"
          android:groupIndicator="@drawable/expandable_list_indicator" />
      
      <LinearLayout
          android:id="@+id/right_drawer_user_info"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
      
          android:layout_gravity="end"
          android:background="@color/side_menu_color"
          android:divider="@android:color/transparent"
          android:dividerHeight="0dp"
          android:orientation="vertical">
      
          <include layout="@layout/userinfo_side_menu"></include>
      </LinearLayout>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 2015-04-11
        相关资源
        最近更新 更多