Adding expandableListView to NavigationView

后端 未结 4 1462
北恋
北恋 2020-11-28 03:15

I have a menu defined in xml:


    

        
4条回答
  •  日久生厌
    2020-11-28 03:40

    You can create it using custom ListView.

    See the code below activity_navigation_view.xml

    
    
    
        
    
        
    
            
            
        
    
    

    The adapter for expandable list view is as follows.

    ExpandableListAdapter.java

    import android.content.Context;
    import android.graphics.Typeface;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.HashMap;
    import java.util.List;
    
    public class ExpandableListAdapter extends BaseExpandableListAdapter {
        private Context mContext;
        private List mListDataHeader; // header titles
    
        // child data in format of header title, child title
        private HashMap> mListDataChild;
        ExpandableListView expandList;
    
        public ExpandableListAdapter(Context context, List listDataHeader, HashMap> listChildData, ExpandableListView mView) {
            this.mContext = context;
            this.mListDataHeader = listDataHeader;
            this.mListDataChild = listChildData;
            this.expandList = mView;
        }
    
        @Override
        public int getGroupCount() {
            int i = mListDataHeader.size();
            Log.d("GROUPCOUNT", String.valueOf(i));
            return this.mListDataHeader.size();
        }
    
        @Override
        public int getChildrenCount(int groupPosition) {
            int childCount = 0;
            if (groupPosition != 2) {
                childCount = this.mListDataChild.get(this.mListDataHeader.get(groupPosition))
                    .size();
            }
            return childCount;
        }
    
        @Override
        public Object getGroup(int groupPosition) {
            return this.mListDataHeader.get(groupPosition);
        }
    
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            Log.d("CHILD", mListDataChild.get(this.mListDataHeader.get(groupPosition))
                .get(childPosition).toString());
            return this.mListDataChild.get(this.mListDataHeader.get(groupPosition))
                .get(childPosition);
        }
    
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }
    
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            ExpandedMenuModel headerTitle = (ExpandedMenuModel) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this.mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.listheader, null);
            }
            TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.submenu);
            ImageView headerIcon = (ImageView) convertView.findViewById(R.id.iconimage);
            lblListHeader.setTypeface(null, Typeface.BOLD);
            lblListHeader.setText(headerTitle.getIconName());
            headerIcon.setImageResource(headerTitle.getIconImg());
            return convertView;
        }
    
        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            final String childText = (String) getChild(groupPosition, childPosition);
    
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this.mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_submenu, null);
            }
    
            TextView txtListChild = (TextView) convertView
                .findViewById(R.id.submenu);
    
            txtListChild.setText(childText);
    
            return convertView;
        }
    
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
    

    list_submenu.xml is as follows.

    
    
    
        
    
    

    listheader.xml is as follows.

    
    
    
        
    
            
    
            
    
        
    
    
    

    In your navigation view activity, set the adapter for the expandable list view. NavigationViewActivity.java

    public class NavigationViewActivity extends AppCompatActivity {
    
        private DrawerLayout mDrawerLayout;
        ExpandableListAdapter mMenuAdapter;
        ExpandableListView expandableList;
        List listDataHeader;
        HashMap> listDataChild;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_navigation_view);
            final ActionBar ab = getSupportActionBar();
            /* to set the menu icon image*/
            ab.setHomeAsUpIndicator(android.R.drawable.ic_menu_add);
            ab.setDisplayHomeAsUpEnabled(true);
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            expandableList = (ExpandableListView) findViewById(R.id.navigationmenu);
            NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    
            if (navigationView != null) {
                setupDrawerContent(navigationView);
            }
    
            prepareListData();
            mMenuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild, expandableList);
    
            // setting list adapter
            expandableList.setAdapter(mMenuAdapter);
    
            expandableList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                @Override
                public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
                    //Log.d("DEBUG", "submenu item clicked");
                    return false;
                }
            });
            expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
                @Override
                public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
                    //Log.d("DEBUG", "heading clicked");
                    return false;
                }
            });
        }
    
        private void prepareListData() {
            listDataHeader = new ArrayList();
            listDataChild = new HashMap>();
    
            ExpandedMenuModel item1 = new ExpandedMenuModel();
            item1.setIconName("heading1");
            item1.setIconImg(android.R.drawable.ic_delete);
            // Adding data header
            listDataHeader.add(item1);
    
            ExpandedMenuModel item2 = new ExpandedMenuModel();
            item2.setIconName("heading2");
            item2.setIconImg(android.R.drawable.ic_delete);
            listDataHeader.add(item2);
    
            ExpandedMenuModel item3 = new ExpandedMenuModel();
            item3.setIconName("heading3");
            item3.setIconImg(android.R.drawable.ic_delete);
            listDataHeader.add(item3);
    
            // Adding child data
            List heading1 = new ArrayList();
            heading1.add("Submenu of item 1");
    
            List heading2 = new ArrayList();
            heading2.add("Submenu of item 2");
            heading2.add("Submenu of item 2");
            heading2.add("Submenu of item 2");
    
            listDataChild.put(listDataHeader.get(0), heading1);// Header, Child data
            listDataChild.put(listDataHeader.get(1), heading2);
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    mDrawerLayout.openDrawer(GravityCompat.START);
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
        private void setupDrawerContent(NavigationView navigationView) {
            //revision: this don't works, use setOnChildClickListener() and setOnGroupClickListener() above instead
            navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        menuItem.setChecked(true);
                        mDrawerLayout.closeDrawers();
                        return true;
                    }
                });
        }
    
    }
    

    ExpandedMenuModel class contains menu item details as follow.

    ExpandedMenuModel.java

    public class ExpandedMenuModel {
    
        String iconName = "";
        int iconImg = -1; // menu icon resource id
    
        public String getIconName() {
            return iconName;
        }
        public void setIconName(String iconName) {
            this.iconName = iconName;
        }
        public int getIconImg() {
            return iconImg;
        }
        public void setIconImg(int iconImg) {
            this.iconImg = iconImg;
        } 
    }
    

    [Side note]:

    1. Don't put import android.widget.ExpandableListAdapter; in NavigationViewActivity.java. This mistake can happen if you resolve import by Alt+Enter before create the file ExpandableListAdapter.java.

    2. Put compile 'com.android.support:design:23.3.0' in app's build.gradle, it's for "NavigationView" and its "import android.support.design.widget.NavigationView;" After that (Might require rebuild first) you can do Alt-Enter to resolve import.

    The file hierarchy should look like (3 .java and 3 .xml from above):

    The output screenshot:

提交回复
热议问题