package com.afollestad.materialdialogs; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.res.Configuration; import android.os.Build; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.TextView; import com.afollestad.materialdialogs.internal.MDCheckBox; import com.afollestad.materialdialogs.internal.MDRadioButton; class MaterialDialogAdapter extends ArrayAdapter { private final MaterialDialog dialog; private final GravityEnum itemGravity; public MaterialDialogAdapter(MaterialDialog dialog, int resource, int textViewResourceId, CharSequence[] objects) { super(dialog.mBuilder.context, resource, textViewResourceId, objects); this.dialog = dialog; this.itemGravity = dialog.mBuilder.itemsGravity; } @Override public boolean hasStableIds() { return true; } @Override public long getItemId(int position) { return position; } @SuppressLint("WrongViewCast") @Override public View getView(final int index, View convertView, ViewGroup parent) { final View view = super.getView(index, convertView, parent); TextView tv = (TextView) view.findViewById(R.id.title); switch (dialog.listType) { case SINGLE: { @SuppressLint("CutPasteId") MDRadioButton radio = (MDRadioButton) view.findViewById(R.id.control); boolean selected = dialog.mBuilder.selectedIndex == index; radio.setColorFilter(dialog.mBuilder.widgetColor); radio.setChecked(selected); break; } case MULTI: { @SuppressLint("CutPasteId") MDCheckBox checkbox = (MDCheckBox) view.findViewById(R.id.control); boolean selected = dialog.selectedIndicesList.contains(index); checkbox.setColorFilter(dialog.mBuilder.widgetColor); checkbox.setChecked(selected); break; } } tv.setText(dialog.mBuilder.items[index]); tv.setTextColor(dialog.mBuilder.itemColor); dialog.setTypeface(tv, dialog.mBuilder.regularFont); view.setTag(index + ":" + dialog.mBuilder.items[index]); setupGravity((ViewGroup) view); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ViewGroup group = (ViewGroup) view; if (group.getChildCount() == 2) { // Remove circular selector from check boxes and radio buttons on Lollipop if (group.getChildAt(0) instanceof CompoundButton) group.getChildAt(0).setBackground(null); else if (group.getChildAt(1) instanceof CompoundButton) group.getChildAt(1).setBackground(null); } } return view; } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void setupGravity(ViewGroup view) { final LinearLayout itemRoot = (LinearLayout) view; final int gravityInt = itemGravity.getGravityInt(); itemRoot.setGravity(gravityInt | Gravity.CENTER_VERTICAL); if (view.getChildCount() == 2) { if (itemGravity == GravityEnum.END && !isRTL() && view.getChildAt(0) instanceof CompoundButton) { CompoundButton first = (CompoundButton) view.getChildAt(0); view.removeView(first); TextView second = (TextView) view.getChildAt(0); view.removeView(second); second.setPadding(second.getPaddingRight(), second.getPaddingTop(), second.getPaddingLeft(), second.getPaddingBottom()); view.addView(second); view.addView(first); } else if (itemGravity == GravityEnum.START && isRTL() && view.getChildAt(1) instanceof CompoundButton) { CompoundButton first = (CompoundButton) view.getChildAt(1); view.removeView(first); TextView second = (TextView) view.getChildAt(0); view.removeView(second); second.setPadding(second.getPaddingRight(), second.getPaddingTop(), second.getPaddingRight(), second.getPaddingBottom()); view.addView(first); view.addView(second); } } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private boolean isRTL() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) return false; Configuration config = getContext().getResources().getConfiguration(); return config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; } }