0

I am trying to create a custom navigation drawer. I was using mikepenz drawer but it has a lot of bugs. I cant use the navigational drawer provided by Android because I am adding menu items on run time. Menu items are added as objects and these objects are created from an XML file upon successful login. Is there any other way to achieve this?

Mikepenz material drawer crashed in API 28

  • use a listview/recyclerView in navigation drawer layout and load items dynamically in listview .No need of any library – Manohar Feb 06 '19 at 08:34
  • I did that using recyclerview, but after everything scrolling wasn't smooth –  Feb 06 '19 at 08:40
  • 1
    Don't write any heavy/ business logic in adapter and dont use constraint layout as child item – Manohar Feb 06 '19 at 08:41
  • 1
    Each item has a name and a string data(URL), without writing it int the adapter where can I write it?. **onClick** I have to load the URL from that item in the web view. –  Feb 06 '19 at 08:45
  • @Redman which works more flexible ? listview or recyclerView –  Feb 06 '19 at 09:01
  • recyclerView is better and more flexible – Manohar Feb 06 '19 at 09:07
  • Try out this : https://stackoverflow.com/a/30978362/1318946 – Pratik Butani Feb 06 '19 at 09:14

2 Answers2

1

Check below example.

Create activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/layout_drawer"
            android:layout_width="250dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#000">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_drawer"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:overScrollMode="never" />
        </RelativeLayout>
    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>`

after that create MainActivity.java

`public class MainActivity extends AppCompatActivity {

    private RecyclerView rvDrawer;
    private DrawerAdapter adDrawer;

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

        ArrayList<DrawerModel> alDrawerData = new ArrayList<>();
        alDrawerData.add("add runtime data her")// added runtime data in this arraylist.
        rvDrawer = findViewById(R.id.rv_drawer);
        rvDrawer.setLayoutManager(new LinearLayoutManager(this));

        adDrawer = new DrawerAdapter();
        rvDrawer.setAdapter(adDrawer);

        adDrawer.addDrawerData(alDrawerData);

    }

}

Create Model class like this DrawerModel.java.

    public class DrawerItem {
        private String label;
        private int imageId;

        public DrawerItem(String label, int imageId) {
            this.label = label;
            this.imageId = imageId;
        }

        public String getLabel() {
            return label;
        }

        public void setLabel(String label) {
            this.label = label;
        }

        public int getImageId() {
            return imageId;
        }

        public void setImageId(int imageId) {
            this.imageId = imageId;
        }
    }

Now, You adapter class like this DrawerAdapter.java

public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.VHDrawer> {

    private Context mContext;
    private ArrayList<DrawerItem> alDrawerData;
    private DrawerAdapter.OnItemClickListener onItemClickListener;
    private String userName;

    public DrawerAdapter(Context context) {
        this.mContext = context;
        alDrawerData = new ArrayList<>();
        this.onItemClickListener = onItemClickListener;
    }


    public String getItem(int position) {
        return alDrawerData.get(position).getLabel();
    }

    @Override
    public DrawerAdapter.VHDrawer onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.lay_drawer_item, parent, false);
        return new DrawerAdapter.VHDrawer(view);
    }

    @Override
    public void onBindViewHolder(DrawerAdapter.VHDrawer holder, int position) {
        DrawerItem drawerItem = alDrawerData.get(position);
        holder.imgDrawer.setImageResource(drawerItem.getImageId());
        holder.tvDrawer.setText(drawerItem.getLabel());
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return alDrawerData.size();
    }


    public void addDrawerData(ArrayList<DrawerItem> alDrawerData) {
        this.alDrawerData = alDrawerData;
        this.notifyDataSetChanged();
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    class VHDrawer extends RecyclerView.ViewHolder {
        @BindView(R.id.imgDrawer)
        ImageView imgDrawer;
        @BindView(R.id.txtDrawer)
        TextView tvDrawer;

        public VHDrawer(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            itemView.setOnClickListener(v -> {
                if (onItemClickListener != null) {
                    onItemClickListener.onItemClick(getAdapterPosition());
                }
            });
        }
    }

}

Now create your drawer item layout file lay_drawer_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"

        android:orientation="horizontal">

        <ImageView
            android:id="@+id/imgDrawer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:contentDescription="@string/app_name"
            android:src="@drawable/dashboard" />

        <TextView
            android:id="@+id/txtDrawer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:textColor="@android:color/white"
            android:textSize="15sp" />

    </LinearLayout>

</RelativeLayout>

If any issue Please let me know.

ishmaelMakitla
  • 3,784
  • 3
  • 26
  • 32
Kaushal Panchal
  • 1,785
  • 1
  • 11
  • 27
  • if i loaded the dyamic recyclerview inside navigation then how am i gonna switch the fragments of tablayout which is also dyanmic in home page by click of dyamic recyclerview items inside navigation inshort im asking navigation with tablayout where items are dynamic for both nav and tab – Wini Dec 17 '20 at 12:01
0

you can add items to navigation drawer on runtime.

NavigationView navView = (NavigationView) findViewById(R.id.nav_view);

Menu menu = navView.getMenu();
Menu submenu = menu.addSubMenu("New Super SubMenu");

submenu.add("Super Item1");
submenu.add("Super Item2");
submenu.add("Super Item3");

navView.invalidate();
  • 1
    Yes we can add,but i want to add it as an object,each item has data ,not just name –  Feb 06 '19 at 08:41