|
1 package org.hedgewars.hedgeroid.util; |
|
2 |
|
3 import java.util.ArrayList; |
|
4 import java.util.Collections; |
|
5 import java.util.Comparator; |
|
6 import java.util.List; |
|
7 |
|
8 import android.database.DataSetObserver; |
|
9 import android.widget.BaseAdapter; |
|
10 |
|
11 public abstract class ObservableTreeMapAdapter<K,V> extends BaseAdapter { |
|
12 private boolean sourceChanged = true; |
|
13 private List<V> entries = new ArrayList<V>(); |
|
14 private ObservableTreeMap<K, V> source; |
|
15 |
|
16 private DataSetObserver observer = new DataSetObserver() { |
|
17 @Override |
|
18 public void onChanged() { |
|
19 sourceChanged = true; |
|
20 notifyDataSetChanged(); |
|
21 } |
|
22 |
|
23 @Override |
|
24 public void onInvalidated() { |
|
25 invalidate(); |
|
26 } |
|
27 }; |
|
28 |
|
29 abstract protected Comparator<V> getEntryOrder(); |
|
30 |
|
31 protected List<V> getEntries() { |
|
32 if(sourceChanged) { |
|
33 entries.clear(); |
|
34 entries.addAll(source.getMap().values()); |
|
35 Collections.sort(entries, getEntryOrder()); |
|
36 sourceChanged = false; |
|
37 } |
|
38 return entries; |
|
39 } |
|
40 |
|
41 public int getCount() { |
|
42 return getEntries().size(); |
|
43 } |
|
44 |
|
45 public V getItem(int position) { |
|
46 return getEntries().get(position); |
|
47 } |
|
48 |
|
49 public long getItemId(int position) { |
|
50 return position; |
|
51 } |
|
52 |
|
53 @Override |
|
54 public boolean hasStableIds() { |
|
55 return false; |
|
56 } |
|
57 |
|
58 public void setSource(ObservableTreeMap<K,V> source) { |
|
59 if(this.source != null) { |
|
60 this.source.unregisterObserver(observer); |
|
61 } |
|
62 this.source = source; |
|
63 this.source.registerObserver(observer); |
|
64 sourceChanged = true; |
|
65 notifyDataSetChanged(); |
|
66 } |
|
67 |
|
68 public void invalidate() { |
|
69 if(source != null) { |
|
70 source.unregisterObserver(observer); |
|
71 } |
|
72 source = null; |
|
73 notifyDataSetInvalidated(); |
|
74 } |
|
75 } |