diff options
author | Marco Nelissen <marcone@google.com> | 2011-04-19 14:07:55 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2011-04-19 14:31:20 -0700 |
commit | 22c04a316a482176957fd27285c0fe36e2f3979c (patch) | |
tree | 8f37b682c78bc81eaf798bb17fbb69fe0b214db6 /core/java/android | |
parent | 08d1f937236230756bffde241ad6b335da368cf9 (diff) | |
download | frameworks_base-22c04a316a482176957fd27285c0fe36e2f3979c.zip frameworks_base-22c04a316a482176957fd27285c0fe36e2f3979c.tar.gz frameworks_base-22c04a316a482176957fd27285c0fe36e2f3979c.tar.bz2 |
Fix bugs in ListView
Make addHeaderView and addFooterView be more consistent with each other: they
now both check that there either is no existing adapter, or that the existing
adapter is a HeaderViewListAdapter, and they both call the DataSetObserver
(previously only addHeaderView would check the adapter, and it would only
check that it was null, while only addFooterView would call the DataSetObserver)
Make removeHeaderView and removeFooterView check that the DataSetObserver
is non-null before using it.
Change-Id: I681b87f70aabca63e664ca8d0c1cfc25530e00b9
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/widget/ListView.java | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index af954c9..9d29a60 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -251,7 +251,7 @@ public class ListView extends AbsListView { */ public void addHeaderView(View v, Object data, boolean isSelectable) { - if (mAdapter != null) { + if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) { throw new IllegalStateException( "Cannot add header view to list -- setAdapter has already been called."); } @@ -261,6 +261,12 @@ public class ListView extends AbsListView { info.data = data; info.isSelectable = isSelectable; mHeaderViewInfos.add(info); + + // in the case of re-adding a header view, or adding one later on, + // we need to notify the observer + if (mDataSetObserver != null) { + mDataSetObserver.onChanged(); + } } /** @@ -294,7 +300,9 @@ public class ListView extends AbsListView { if (mHeaderViewInfos.size() > 0) { boolean result = false; if (((HeaderViewListAdapter) mAdapter).removeHeader(v)) { - mDataSetObserver.onChanged(); + if (mDataSetObserver != null) { + mDataSetObserver.onChanged(); + } result = true; } removeFixedViewInfo(v, mHeaderViewInfos); @@ -328,6 +336,12 @@ public class ListView extends AbsListView { * @param isSelectable true if the footer view can be selected */ public void addFooterView(View v, Object data, boolean isSelectable) { + + if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) { + throw new IllegalStateException( + "Cannot add footer view to list -- setAdapter has already been called."); + } + FixedViewInfo info = new FixedViewInfo(); info.view = v; info.data = data; @@ -371,7 +385,9 @@ public class ListView extends AbsListView { if (mFooterViewInfos.size() > 0) { boolean result = false; if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) { - mDataSetObserver.onChanged(); + if (mDataSetObserver != null) { + mDataSetObserver.onChanged(); + } result = true; } removeFixedViewInfo(v, mFooterViewInfos); |