1
+ package com .devbrackets .android .recyclerext .adapter .viewholder ;
2
+
3
+ import android .support .annotation .IdRes ;
4
+ import android .support .annotation .MenuRes ;
5
+ import android .support .annotation .Nullable ;
6
+ import android .support .v7 .widget .PopupMenu ;
7
+ import android .view .Menu ;
8
+ import android .view .MenuInflater ;
9
+ import android .view .MenuItem ;
10
+ import android .view .View ;
11
+
12
+ /**
13
+ * A simple ViewHolder that extends {@link ClickableViewHolder} to provide the
14
+ * functionality for providing and registering for popup menu selection events
15
+ */
16
+ public abstract class MenuViewHolder extends ClickableViewHolder implements PopupMenu .OnMenuItemClickListener {
17
+
18
+ public interface OnMenuItemSelectedListener {
19
+ boolean onMenuItemSelected (MenuViewHolder viewHolder , MenuItem menuItem );
20
+ }
21
+
22
+ @ Nullable
23
+ private OnMenuItemSelectedListener onMenuItemSelectedListener ;
24
+
25
+ /**
26
+ * Retrieves the id for the view that will be used to show the
27
+ * popup menu when clicked.
28
+ *
29
+ * @return The resource id for the menu view
30
+ */
31
+ @ IdRes
32
+ protected abstract int getMenuViewId ();
33
+
34
+ /**
35
+ * Retrieves the id for the xml menu resource that specifies
36
+ * the options for the popup menu.
37
+ *
38
+ * @return The resource id for the xml menu
39
+ */
40
+ @ MenuRes
41
+ protected abstract int getMenuResourceId ();
42
+
43
+ public MenuViewHolder (View itemView ) {
44
+ super (itemView );
45
+ initializeMenuClickListener ();
46
+ }
47
+
48
+ public void setOnMenuItemSelectedListener (@ Nullable OnMenuItemSelectedListener listener ) {
49
+ this .onMenuItemSelectedListener = listener ;
50
+ }
51
+
52
+ @ Override
53
+ public boolean onMenuItemClick (MenuItem item ) {
54
+ return onMenuItemSelectedListener != null && onMenuItemSelectedListener .onMenuItemSelected (this , item );
55
+ }
56
+
57
+ /**
58
+ * Registers the view specified with {@link #getMenuViewId()} to
59
+ * show the popup menu specified with {@link #getMenuResourceId()}
60
+ */
61
+ protected void initializeMenuClickListener () {
62
+ View menuView = itemView .findViewById (getMenuViewId ());
63
+ if (menuView != null ) {
64
+ menuView .setOnClickListener (new MenuClickListener ());
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Shows the menu specified with the <code>menuResourceId</code> starting
70
+ * at the <code>anchor</code>
71
+ *
72
+ * @param anchor The view to show the popup menu from
73
+ * @param menuResourceId The resource id for the menu to show
74
+ */
75
+ protected void showMenu (View anchor , @ MenuRes int menuResourceId ) {
76
+ PopupMenu menu = new PopupMenu (anchor .getContext (), anchor );
77
+ MenuInflater inflater = menu .getMenuInflater ();
78
+ inflater .inflate (menuResourceId , menu .getMenu ());
79
+
80
+ onPreparePopupMenu (menu .getMenu ());
81
+ menu .setOnMenuItemClickListener (this );
82
+ menu .show ();
83
+ }
84
+
85
+ /**
86
+ * Allows the user to customize the popup menu specified with {@link #getMenuResourceId()}
87
+ * before it is shown
88
+ *
89
+ * @param menu The menu to customize
90
+ */
91
+ protected void onPreparePopupMenu (Menu menu ) {
92
+ //Purposefully left blank
93
+ }
94
+
95
+ /**
96
+ * A simple click listener class to handle menu view clicks
97
+ */
98
+ protected class MenuClickListener implements View .OnClickListener {
99
+ @ Override
100
+ public void onClick (View view ) {
101
+ showMenu (view , getMenuResourceId ());
102
+ }
103
+ }
104
+ }
0 commit comments