OSDN Git Service

styling fixes
[android-x86/external-koush-Widgets.git] / Widgets / src / com / koushikdutta / widgets / BetterListFragment.java
1 package com.koushikdutta.widgets;
2
3 import java.util.Comparator;
4
5 import android.content.Context;
6 import android.content.res.Configuration;
7 import android.os.Bundle;
8 import android.os.Handler;
9 import android.support.v4.app.Fragment;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.AdapterView;
14 import android.widget.AdapterView.OnItemClickListener;
15 import android.widget.AdapterView.OnItemLongClickListener;
16 import android.widget.ArrayAdapter;
17 import android.widget.ListView;
18 import android.widget.TextView;
19
20 public class BetterListFragment extends Fragment {
21     boolean mDestroyed = false;
22     
23     ListView mListView;
24     MyAdapter mAdapter;
25     
26     @Override
27     public void onConfigurationChanged(Configuration newConfig) {
28         super.onConfigurationChanged(newConfig);
29         float hor = getResources().getDimension(R.dimen.list_horizontal_margin);
30         float ver = getResources().getDimension(R.dimen.list_vertical_margin);
31         mListView.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
32     }
33     
34     public class MyAdapter extends SeparatedListAdapter<ListItemAdapter> {
35         public MyAdapter(Context context) {
36             super(context);
37         }
38         
39         @Override
40         protected int getListHeaderResource() {
41             return BetterListFragment.this.getListHeaderResource();
42         }
43         
44         @Override
45         public boolean areAllItemsEnabled() {
46             return false;
47         }
48         
49         @Override
50         public boolean isEnabled(int position) {
51             if (!super.isEnabled(position))
52                 return false;
53             ListItem item = (ListItem) getItem(position);
54             if (item == null)
55                 return false;
56             return item.getEnabled();
57         }
58     }
59     
60     public class ListItemAdapter extends ArrayAdapter<ListItem> {
61         public ListItemAdapter(Context context) {
62             super(context, 0);
63         }
64         
65         @Override
66         public View getView(int position, View convertView, ViewGroup parent) {
67             ListItem item = getItem(position);
68             return item.getView(getContext(), convertView);
69         }
70         
71         @Override
72         public boolean areAllItemsEnabled() {
73             return false;
74         }
75         
76         @Override
77         public boolean isEnabled(int position) {
78             ListItem item = getItem(position);
79             return item.getEnabled();
80         }
81         
82         boolean sorting;
83         @Override
84         public void notifyDataSetChanged() {
85             if (sorter != null && !sorting) {
86                 sorting = true;
87                 super.sort(sorter);
88                 sorting = false;
89             }
90             else {
91                 super.notifyDataSetChanged();
92             }
93         }
94         
95         private Comparator<ListItem> sorter;
96         public void setSort(Comparator<ListItem> sorter) {
97             this.sorter = sorter;
98             notifyDataSetChanged();
99             mAdapter.notifyDataSetChanged();
100         }
101         
102         public Comparator<ListItem> getSort() {
103             return sorter;
104         }
105         
106         public Comparator<ListItem> ALPHA = new Comparator<ListItem>() {
107             @Override
108             public int compare(ListItem lhs, ListItem rhs) {
109                 return lhs.getTitle().compareTo(rhs.getTitle());
110             }
111         };
112         
113         public Comparator<ListItem> ALPHAIGNORECASE = new Comparator<ListItem>() {
114             @Override
115             public int compare(ListItem lhs, ListItem rhs) {
116                 return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
117             }
118         };
119
120         public Comparator<ListItem> NONE = new Comparator<ListItem>() {
121             @Override
122             public int compare(ListItem lhs, ListItem rhs) {
123                 return ((Integer)getPosition(lhs)).compareTo(getPosition(rhs));
124             }
125         };
126     }
127     
128 //    HashMap<String, MyListAdapter> mAdapters = new HashMap<String, ActivityBaseFragment.MyListAdapter>();
129     
130     public ListItemAdapter ensureHeader(int sectionName) {
131         return ensureHeader(mAdapter.getSectionCount(), getString(sectionName));
132     }
133     
134     public ListItemAdapter ensureHeader(String sectionName) {
135         return ensureHeader(mAdapter.getSectionCount(), sectionName);
136     }
137
138     public ListItemAdapter ensureHeader(int index, int sectionName) {
139         return ensureHeader(index, getString(sectionName));
140     }
141     public ListItemAdapter ensureHeader(int index, String sectionName) {
142         ListItemAdapter adapter = mAdapter.getSection(sectionName);
143         if (adapter == null) {
144             adapter = new ListItemAdapter(getActivity());
145             mAdapter.addSection(index, sectionName, adapter);
146             mListView.setAdapter(null);
147             mListView.setAdapter(mAdapter);
148         }
149         return adapter;
150     }
151     
152     public ListItemAdapter getSection(int section) {
153         return getSection(getString(section));
154     }
155     
156     public ListItemAdapter getSection(String section) {
157         return mAdapter.getSection(section);
158     }
159
160     public ListItem addItem(int sectionName, ListItem item) {
161         return addItem(getString(sectionName), item);
162     }
163
164     public ListItem addItem(int sectionName, ListItem item, int index) {
165         return addItem(getString(sectionName), item, index);
166     }
167     
168     public ListItem addItem(String sectionName, ListItem item) {
169         return addItem(sectionName, item, -1);
170     }
171     
172     public int getSectionItemCount(int section) {
173         return getSectionItemCount(getString(section));
174     }
175     
176     public int getSectionItemCount(String section) {
177         ListItemAdapter adapter = mAdapter.getSection(section);
178         if (adapter == null)
179             return 0;
180         return adapter.getCount();
181     }
182
183     public ListItem addItem(String sectionName, ListItem item, int index) {
184         ListItemAdapter adapter = mAdapter.getSection(sectionName);
185         if (adapter == null) {
186             adapter = new ListItemAdapter(getActivity());
187             mAdapter.addSection(sectionName, adapter);
188             if (mListView != null) {
189                 mListView.setAdapter(null);
190                 mListView.setAdapter(mAdapter);
191             }
192 //            mAdapter.notifyDataSetChanged();
193         }
194         
195         if (index != -1)
196             adapter.insert(item, index);
197         else
198             adapter.add(item);
199
200         mAdapter.notifyDataSetChanged();
201         return item;
202     }
203     
204     public ListItem findItem(int item) {
205         String text = getString(item);
206         
207         for (ListItemAdapter adapter: mAdapter.getSections())
208         {
209             for (int i = 0; i < adapter.getCount(); i++) {
210                 ListItem li = adapter.getItem(i);
211                 if (text.equals(li.getTitle()))
212                     return li;
213             }
214         }
215         
216         return null;
217     }
218     
219     private ActivityBaseFragmentListener mListener;
220     public ActivityBaseFragmentListener getListener() {
221         return mListener;
222     }
223     
224     public void setListener(ActivityBaseFragmentListener listener) {
225         mListener = listener;
226     }
227     
228     public static interface ActivityBaseFragmentListener {
229         void onCreate(Bundle savedInstanceState, View view);
230     }
231     
232     protected void onCreate(Bundle savedInstanceState, View view) {
233         if (mListener != null)
234             mListener.onCreate(savedInstanceState, view);
235     }
236     
237     protected int getListFragmentResource() {
238         return R.layout.list_fragment;
239     }
240     
241     void onListItemClick(ListItem li) {
242         
243     }
244     
245     ViewGroup mTitleContainer;
246     TextView mEmpty;
247     @Override
248     public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
249         View ret = inflater.inflate(getListFragmentResource(), container, false);
250
251         mTitleContainer = (ViewGroup)ret.findViewById(R.id.title_container);
252
253         mListView = (ListView)ret.findViewById(R.id.listview);
254         mListView.setOnItemClickListener(new OnItemClickListener() {
255             @Override
256             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
257                 Object item = mAdapter.getItem(arg2);
258                 if (item instanceof ListItem) {
259                     ListItem li = (ListItem)item;
260                     onListItemClick(li);
261                     li.onClickInternal(arg1);
262                 }
263             }
264         });
265         
266         mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
267
268             @Override
269             public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
270                 Object item = mAdapter.getItem(arg2);
271                 if (item instanceof ListItem) {
272                     ListItem li = (ListItem)item;
273                     return li.onLongClick();
274                 }
275                 return false;
276             }
277         });
278         
279         mListView.setAdapter(mAdapter);
280         mEmpty = (TextView)ret.findViewById(R.id.empty);
281         
282         onCreate(savedInstanceState, ret);
283         return ret;
284     }
285
286     @Override
287     public final void onCreate(Bundle savedInstanceState) {
288         super.onCreate(savedInstanceState);
289
290         mAdapter = new MyAdapter(getActivity());
291     }
292
293     Handler handler = new Handler();
294     
295     @Override
296     public void onDestroy() {
297         super.onDestroy();
298         
299         mDestroyed = true;
300     }
301     
302     protected int getListHeaderResource() {
303         return R.layout.list_header;
304     }
305     
306     protected int getListItemResource() {
307         return R.layout.list_item;
308     }
309
310     public void clear() {
311         mAdapter.clear();
312     }
313     
314     public void clearSection(int section) {
315         clearSection(mListView.getContext().getString(section));
316     }
317     
318     public void clearSection(String section) {
319         ListItemAdapter adapter = mAdapter.getSection(section);
320         if (adapter == null)
321             return;
322         adapter.clear();
323         mAdapter.notifyDataSetChanged();
324     }
325     
326     public void removeSection(int section) {
327         removeSection(mListView.getContext().getString(section));
328     }
329     
330     public void removeSection(String section) {
331         mAdapter.removeSection(section);
332     }
333     
334     public void removeItem(ListItem item) {
335         for (ListItemAdapter adapter: mAdapter.getSections()) {
336             adapter.remove(item);
337         }
338         mAdapter.notifyDataSetChanged();
339     }
340     
341     public void setEmpty(int res) {
342         mListView.setEmptyView(mEmpty);
343         mEmpty.setText(res);
344     }
345     
346     public ListView getListView() {
347         return mListView;
348     }
349     
350     public MyAdapter getAdapter() {
351         return mAdapter;
352     }
353     
354     public ViewGroup getTitleContainer() {
355         return mTitleContainer;
356     }
357 }