Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to customize the DrawerItem using the lib mikepenz/MaterialDrawer

I am using the lib MaterialDrawer (https://github.com/mikepenz/MaterialDrawer).

I would like to use the side bar on the right as the filter section like Foursquare filter:

enter image description here

But I noticed that there are only SectionDrawerItem.java, SwitchDrawerItem.java and ToggleDrawerItem.java that defined toggle and switch. But they are not enough to define the filters. I would like to ask if I can define my own layout for the sidebar or add more options to the DrawerItem? Thanks in advance!

like image 575
Shi Avatar asked Jun 24 '15 15:06

Shi


2 Answers

The easiest solution is to extend one of the existing DrawerItems, but this only works if you do not need a completely different item.

A CustomDrawerItem is already shown in the sample application

public class CustomPrimaryDrawerItem extends PrimaryDrawerItem {

    private ColorHolder background;

    public CustomPrimaryDrawerItem withBackgroundColor(int backgroundColor) {
        this.background = ColorHolder.fromColor(backgroundColor);
        return this;
    }

    public CustomPrimaryDrawerItem withBackgroundRes(int backgroundRes) {
        this.background = ColorHolder.fromColorRes(backgroundRes);
        return this;
    }

    @Override
    public void bindView(RecyclerView.ViewHolder holder) {
        super.bindView(holder);

        if (background != null) {
            background.applyToBackground(holder.itemView);
        }
    }
}

If you need more customization just implement the IDrawerItem interface and implement the methods. An easier DrawerItem which implements the AbstractDrawerItem which comes with a few predefined methods and properties is the DividerDrawerItem

public class DividerDrawerItem extends AbstractDrawerItem<DividerDrawerItem> {
    @Override
    public String getType() {
        return "DIVIDER_ITEM";
    }

    @Override
    @LayoutRes
    public int getLayoutRes() {
        return R.layout.material_drawer_item_divider;
    }

    @Override
    public void bindView(RecyclerView.ViewHolder holder) {
        Context ctx = holder.itemView.getContext();

        //get our viewHolder
        ViewHolder viewHolder = (ViewHolder) holder;

        //set the identifier from the drawerItem here. It can be used to run tests
        holder.itemView.setId(getIdentifier());

        //define how the divider should look like
        viewHolder.view.setClickable(false);
        viewHolder.view.setEnabled(false);
        viewHolder.view.setMinimumHeight(1);

        //set the color for the divider
        viewHolder.divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_divider, R.color.material_drawer_divider));

        //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
        onPostBindView(this, holder.itemView);
    }

    @Override
    public ViewHolderFactory getFactory() {
        return new ItemFactory();
    }

    public static class ItemFactory implements ViewHolderFactory<ViewHolder> {
        public ViewHolder factory(View v) {
            return new ViewHolder(v);
        }
    }

    private static class ViewHolder extends RecyclerView.ViewHolder {
        private View view;
        private View divider;

        private ViewHolder(View view) {
            super(view);
            this.view = view;
            this.divider = view.findViewById(R.id.material_drawer_divider);
        }
    }
}
like image 52
mikepenz Avatar answered Nov 03 '22 15:11

mikepenz


I created a class that extends BaseDrawerItem to customize DrawerItem . it works.

like image 41
Shi Avatar answered Nov 03 '22 16:11

Shi