Skip to content

Instantly share code, notes, and snippets.

@thenickreynolds
Created December 9, 2016 20:18
Show Gist options
  • Save thenickreynolds/cfed4e19ebc94a0cae871bbeef3ba46c to your computer and use it in GitHub Desktop.
Save thenickreynolds/cfed4e19ebc94a0cae871bbeef3ba46c to your computer and use it in GitHub Desktop.
This is a possible solution to allow adapters to create options menus without knowing about UI... Similar to providing a list of options to the fragment in many ways
import android.content.Context;
import android.support.design.widget.BottomSheetDialog;
import android.support.v7.view.menu.MenuBuilder;
import com.airbnb.android.utils.Check;
import com.airbnb.n2.BottomSheetBuilder;
import com.airbnb.n2.BottomSheetItemClickListener;
import com.airbnb.n2.BottomSheetMenuItem;
import java.util.List;
public class OptionsMenuFactory {
public interface MenuListener<T> {
void canceled();
void itemSelected(T value);
}
public static class MenuItemOption<T> {
final CharSequence text;
final T value;
MenuItemOption(CharSequence text, T value) {
this.text = text;
this.value = value;
}
}
private static class MenuClosingBottomSheetItemListener implements BottomSheetItemClickListener {
private final BottomSheetItemClickListener wrappedListener;
private BottomSheetDialog dialog;
MenuClosingBottomSheetItemListener(BottomSheetItemClickListener wrappedListener) {
this.wrappedListener = wrappedListener;
}
public void setDialog(BottomSheetDialog dialog) {
this.dialog = dialog;
}
@Override
public void onBottomSheetItemClick(BottomSheetMenuItem item) {
Check.notNull(dialog);
wrappedListener.onBottomSheetItemClick(item);
dialog.dismiss();
}
}
private final Context context;
public OptionsMenuFactory(Context context) {
this.context = context;
}
public <T> void showMenu(List<MenuItemOption<T>> options, MenuListener<T> listener) {
MenuBuilder menu = new MenuBuilder(context);
for (int i = 0; i < options.size(); i++) {
menu.add(0, i, i, options.get(i).text);
}
MenuClosingBottomSheetItemListener wrappedListener = new MenuClosingBottomSheetItemListener(item -> listener.itemSelected(options.get(item.getId()).value));
BottomSheetDialog dialog = new BottomSheetBuilder(context, menu)
.setItemClickListener(wrappedListener)
.build();
wrappedListener.setDialog(dialog);
dialog.setOnCancelListener(d -> listener.canceled());
dialog.show();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment