Browse Source

Release 0.3.2

Aidan Follestad 10 years ago
parent
commit
1e6290a5fd

+ 30 - 4
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -6,6 +6,7 @@ import android.content.DialogInterface;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
+import android.database.DataSetObserver;
 import android.graphics.Paint;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
@@ -36,6 +37,7 @@ import android.widget.ScrollView;
 import android.widget.TextView;
 
 import com.afollestad.materialdialogs.base.DialogBase;
+import com.afollestad.materialdialogs.views.MeasureCallbackListView;
 import com.afollestad.materialdialogs.views.MeasureCallbackScrollView;
 
 import java.util.ArrayList;
@@ -45,7 +47,7 @@ import java.util.List;
 /**
  * @author Aidan Follestad (afollestad)
  */
-public class MaterialDialog extends DialogBase implements View.OnClickListener, MeasureCallbackScrollView.Callback {
+public class MaterialDialog extends DialogBase implements View.OnClickListener, MeasureCallbackScrollView.Callback, MeasureCallbackListView.Callback {
 
     private ImageView icon;
     private TextView title;
@@ -165,6 +167,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         if (items != null && items.length > 0 || adapterProvided) {
             title = (TextView) view.findViewById(R.id.titleCustomView);
             listView = (ListView) view.findViewById(R.id.contentListView);
+            ((MeasureCallbackListView) listView).setCallback(this);
 
             if (!adapterProvided) {
                 // Determine list type
@@ -176,9 +179,21 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
                 } else {
                     listType = ListType.REGULAR;
                 }
-
                 adapter = new MaterialDialogAdapter(mContext, ListType.getLayoutForType(listType), R.id.title, items);
             }
+
+            adapter.registerDataSetObserver(new DataSetObserver() {
+                @Override
+                public void onChanged() {
+                    super.onChanged();
+                    listView.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            invalidateCustomViewAssociations();
+                        }
+                    });
+                }
+            });
         }
 
         // Title is set after it's determined whether to use first title or custom view title
@@ -210,6 +225,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
     public void onShow(DialogInterface dialog) {
         super.onShow(dialog); // calls any external show listeners
         checkIfStackingNeeded();
+        invalidateCustomViewAssociations();
     }
 
     /**
@@ -219,7 +235,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         if (customView != null || (items != null && items.length > 0) || adapter != null) {
             view.findViewById(R.id.mainFrame).setVisibility(View.GONE);
             view.findViewById(R.id.customViewScrollParent).setVisibility(View.VISIBLE);
-            if (!mMeasuredScrollView) {
+            if (!mMeasuredScrollView && listView == null) {
                 // Wait until it's measured
                 ((MeasureCallbackScrollView) view.findViewById(R.id.customViewScroll)).setCallback(this);
                 return;
@@ -366,6 +382,12 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
      * Detects whether or not the custom view or list content can be scrolled.
      */
     private boolean canCustomViewScroll() {
+        if (listView != null) {
+            if (listView.getLastVisiblePosition() != -1) {
+                return listView.getLastVisiblePosition() < (listView.getCount() - 1);
+            }
+            return false;
+        }
         final ScrollView scrollView = (ScrollView) view.findViewById(R.id.customViewScroll);
         final int childHeight = view.findViewById(R.id.customViewFrame).getMeasuredHeight();
         return scrollView.getMeasuredHeight() < childHeight;
@@ -375,7 +397,6 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
      * Detects whether or not the content TextView can be scrolled.
      */
     private boolean canContentScroll() {
-        if (listView != null) return true;
         final ScrollView scrollView = (ScrollView) view.findViewById(R.id.contentScrollView);
         final int childHeight = view.findViewById(R.id.content).getMeasuredHeight();
         return scrollView.getMeasuredHeight() < childHeight;
@@ -554,6 +575,11 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         }
     }
 
+    @Override
+    public void onMeasureScroll(ListView view) {
+        invalidateCustomViewAssociations();
+    }
+
     /**
      * The class used to construct a MaterialDialog.
      */

+ 40 - 0
library/src/main/java/com/afollestad/materialdialogs/views/MeasureCallbackListView.java

@@ -0,0 +1,40 @@
+package com.afollestad.materialdialogs.views;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ListView;
+
+/**
+ * @author Aidan Follestad (afollestad)
+ */
+public class MeasureCallbackListView extends ListView {
+
+    public MeasureCallbackListView(Context context) {
+        super(context);
+    }
+
+    public MeasureCallbackListView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MeasureCallbackListView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public static interface Callback {
+        void onMeasureScroll(ListView view);
+    }
+
+    private Callback mCallback;
+
+    public void setCallback(Callback mCallback) {
+        this.mCallback = mCallback;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mCallback != null)
+            mCallback.onMeasureScroll(this);
+    }
+}

+ 1 - 1
library/src/main/res/layout/md_dialog.xml

@@ -116,7 +116,7 @@
             android:orientation="vertical"
             android:visibility="gone">
 
-            <ListView
+            <com.afollestad.materialdialogs.views.MeasureCallbackListView
                 android:id="@+id/contentListView"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"

BIN
sample/sample.apk