Browse Source

Made single choice dialog more efficient, fixed last radio button not animating on Lollipop. Resolves #514.

Aidan Follestad 10 years ago
parent
commit
0f69dc329c

+ 4 - 10
library/src/main/java/com/afollestad/materialdialogs/DialogInit.java

@@ -117,6 +117,7 @@ class DialogInit {
         dialog.neutralButton = (MDButton) dialog.view.findViewById(R.id.buttonDefaultNeutral);
         dialog.negativeButton = (MDButton) dialog.view.findViewById(R.id.buttonDefaultNegative);
 
+        // Don't allow the submit button to not be shown for input dialogs
         if (builder.inputCallback != null && builder.positiveText == null)
             builder.positiveText = builder.context.getText(android.R.string.ok);
 
@@ -192,7 +193,7 @@ class DialogInit {
             dialog.content.setVisibility(View.GONE);
         }
 
-        // Setup buttons
+        // Setup action buttons
         dialog.view.setButtonGravity(builder.buttonsGravity);
         dialog.view.setButtonStackedGravity(builder.btnStackedGravity);
         dialog.view.setForceStack(builder.forceStacking);
@@ -205,7 +206,6 @@ class DialogInit {
             textAllCaps = DialogUtils.resolveBoolean(builder.context, R.attr.textAllCaps, true);
         }
 
-//        if (dialog.positiveButton != null && builder.positiveText != null) {
         MDButton positiveTextView = dialog.positiveButton;
         dialog.setTypeface(positiveTextView, builder.mediumFont);
         positiveTextView.setAllCapsCompat(textAllCaps);
@@ -216,9 +216,7 @@ class DialogInit {
         dialog.positiveButton.setTag(DialogAction.POSITIVE);
         dialog.positiveButton.setOnClickListener(dialog);
         dialog.positiveButton.setVisibility(View.VISIBLE);
-//        }
 
-//        if (dialog.negativeButton != null && builder.negativeText != null) {
         MDButton negativeTextView = dialog.negativeButton;
         dialog.setTypeface(negativeTextView, builder.mediumFont);
         negativeTextView.setAllCapsCompat(textAllCaps);
@@ -229,9 +227,7 @@ class DialogInit {
         dialog.negativeButton.setTag(DialogAction.NEGATIVE);
         dialog.negativeButton.setOnClickListener(dialog);
         dialog.negativeButton.setVisibility(View.VISIBLE);
-//        }
 
-//        if (dialog.neutralButton != null && builder.neutralText != null) {
         MDButton neutralTextView = dialog.neutralButton;
         dialog.setTypeface(neutralTextView, builder.mediumFont);
         neutralTextView.setAllCapsCompat(textAllCaps);
@@ -242,7 +238,6 @@ class DialogInit {
         dialog.neutralButton.setTag(DialogAction.NEUTRAL);
         dialog.neutralButton.setOnClickListener(dialog);
         dialog.neutralButton.setVisibility(View.VISIBLE);
-//        }
 
         // Setup list dialog stuff
         if (builder.listCallbackMultiChoice != null)
@@ -258,9 +253,8 @@ class DialogInit {
                     dialog.listType = MaterialDialog.ListType.SINGLE;
                 } else if (builder.listCallbackMultiChoice != null) {
                     dialog.listType = MaterialDialog.ListType.MULTI;
-                    if (builder.selectedIndices != null) {
+                    if (builder.selectedIndices != null)
                         dialog.selectedIndicesList = new ArrayList<>(Arrays.asList(builder.selectedIndices));
-                    }
                 } else {
                     dialog.listType = MaterialDialog.ListType.REGULAR;
                 }
@@ -268,7 +262,7 @@ class DialogInit {
                         MaterialDialog.ListType.getLayoutForType(dialog.listType), R.id.title, builder.items);
             } else if (builder.adapter instanceof MaterialSimpleListAdapter) {
                 // Notify simple list adapter of the dialog it belongs to
-                ((MaterialSimpleListAdapter) builder.adapter).setDialog(dialog);
+                ((MaterialSimpleListAdapter) builder.adapter).setDialog(dialog, false);
             }
         }
 

+ 15 - 3
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -30,10 +30,10 @@ import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.ProgressBar;
+import android.widget.RadioButton;
 import android.widget.TextView;
 
 import com.afollestad.materialdialogs.internal.MDButton;
@@ -171,7 +171,7 @@ public class MaterialDialog extends DialogBase implements
             // Default adapter, choice mode
             if (listType == ListType.MULTI) {
                 final boolean shouldBeChecked = !selectedIndicesList.contains(Integer.valueOf(position));
-                final CheckBox cb = (CheckBox) ((LinearLayout) view).getChildAt(0);
+                final CheckBox cb = (CheckBox) view.findViewById(R.id.control);
                 if (shouldBeChecked) {
                     // Add the selection to the states first so the callback includes it (when alwaysCallMultiChoiceCallback)
                     selectedIndicesList.add(position);
@@ -196,6 +196,9 @@ public class MaterialDialog extends DialogBase implements
                 }
             } else if (listType == ListType.SINGLE) {
                 boolean allowSelection = true;
+                final MaterialDialogAdapter adapter = (MaterialDialogAdapter) mBuilder.adapter;
+                final RadioButton radio = (RadioButton) view.findViewById(R.id.control);
+
                 if (mBuilder.autoDismiss && mBuilder.positiveText == null) {
                     // If auto dismiss is enabled, and no action button is visible to approve the selection, dismiss the dialog
                     dismiss();
@@ -216,7 +219,16 @@ public class MaterialDialog extends DialogBase implements
                 // Update the checked states
                 if (allowSelection && mBuilder.selectedIndex != position) {
                     mBuilder.selectedIndex = position;
-                    ((MaterialDialogAdapter) mBuilder.adapter).notifyDataSetChanged();
+                    // Uncheck the previously selected radio button
+                    if (adapter.mRadioButton == null) {
+                        adapter.mInitRadio = true;
+                        adapter.notifyDataSetChanged();
+                    }
+                    if (adapter.mRadioButton != null)
+                        adapter.mRadioButton.setChecked(false);
+                    // Check the newly selected radio button
+                    radio.setChecked(true);
+                    adapter.mRadioButton = radio;
                 }
             }
 

+ 4 - 0
library/src/main/java/com/afollestad/materialdialogs/MaterialDialogAdapter.java

@@ -20,6 +20,8 @@ class MaterialDialogAdapter extends ArrayAdapter<CharSequence> {
 
     private final MaterialDialog dialog;
     private final GravityEnum itemGravity;
+    public RadioButton mRadioButton;
+    public boolean mInitRadio;
 
     public MaterialDialogAdapter(MaterialDialog dialog, int resource, int textViewResourceId, CharSequence[] objects) {
         super(dialog.mBuilder.context, resource, textViewResourceId, objects);
@@ -49,6 +51,8 @@ class MaterialDialogAdapter extends ArrayAdapter<CharSequence> {
                 boolean selected = dialog.mBuilder.selectedIndex == index;
                 MDTintHelper.setTint(radio, dialog.mBuilder.widgetColor);
                 radio.setChecked(selected);
+                if (selected && mInitRadio)
+                    mRadioButton = radio;
                 break;
             }
             case MULTI: {

+ 6 - 1
library/src/main/java/com/afollestad/materialdialogs/simplelist/MaterialSimpleListAdapter.java

@@ -25,8 +25,13 @@ public class MaterialSimpleListAdapter extends ArrayAdapter<MaterialSimpleListIt
     private MaterialDialog dialog;
 
     public void setDialog(MaterialDialog dialog) {
+        setDialog(dialog, true);
+    }
+
+    public void setDialog(MaterialDialog dialog, boolean notifyDataSetChanged) {
         this.dialog = dialog;
-        notifyDataSetChanged();
+        if (notifyDataSetChanged)
+            notifyDataSetChanged();
     }
 
     public MaterialSimpleListAdapter(Context context) {