package carbon.dialog; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.StyleRes; import com.annimon.stream.Stream; import java.util.ArrayList; import java.util.List; import carbon.R; import carbon.component.DataBindingComponent; import carbon.recycler.RowFactory; import carbon.widget.CheckBox; import carbon.widget.RecyclerView; public class MultiSelectDialog<Type> extends ListDialog<Type> { private List<Type> selectedItems = new ArrayList<>(); public MultiSelectDialog(@NonNull Context context) { super(context); init(); } public MultiSelectDialog(@NonNull Context context, @StyleRes int themeResId) { super(context, themeResId); init(); } private void init() { setPositiveButton("ok", null); } protected RecyclerView.OnItemClickedListener getInternalListener() { return (view, item, position) -> { Type selectedItem = items.get(position); if (selectedItems.contains(selectedItem)) { selectedItems.remove(selectedItem); } else { selectedItems.add(selectedItem); } if (listener != null) listener.onItemClicked(view, item, position); }; } @Override public void setItems(Type[] items, RowFactory<Type> factory) { throw new RuntimeException("not supported"); } @Override public void setItems(List<Type> items, RowFactory<Type> factory) { throw new RuntimeException("not supported"); } public void setItems(Type[] items) { super.setItems(items, parent -> new DataBindingComponent(parent, R.layout.carbon_row_dialog_checkboxtext) { @Override public void bind(Object data) { super.bind(data); if (selectedItems.contains(data)) { CheckBox checkBox = (CheckBox) getView().findViewById(R.id.carbon_checkBox); checkBox.setChecked(true); } } }); } public void setSelectedItems(Type[] selectedItems) { this.selectedItems.clear(); Stream.of(selectedItems).forEach(item -> this.selectedItems.add(item)); } }