1 package com.koushikdutta.widgets;
3 import java.util.Comparator;
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;
20 public class BetterListFragment extends Fragment {
21 boolean mDestroyed = false;
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);
34 public class MyAdapter extends SeparatedListAdapter<ListItemAdapter> {
35 public MyAdapter(Context context) {
40 protected int getListHeaderResource() {
41 return BetterListFragment.this.getListHeaderResource();
45 public boolean areAllItemsEnabled() {
50 public boolean isEnabled(int position) {
51 if (!super.isEnabled(position))
53 ListItem item = (ListItem) getItem(position);
56 return item.getEnabled();
60 public class ListItemAdapter extends ArrayAdapter<ListItem> {
61 public ListItemAdapter(Context context) {
66 public View getView(int position, View convertView, ViewGroup parent) {
67 ListItem item = getItem(position);
68 return item.getView(getContext(), convertView);
72 public boolean areAllItemsEnabled() {
77 public boolean isEnabled(int position) {
78 ListItem item = getItem(position);
79 return item.getEnabled();
84 public void notifyDataSetChanged() {
85 if (sorter != null && !sorting) {
91 super.notifyDataSetChanged();
95 private Comparator<ListItem> sorter;
96 public void setSort(Comparator<ListItem> sorter) {
98 notifyDataSetChanged();
99 mAdapter.notifyDataSetChanged();
102 public Comparator<ListItem> getSort() {
106 public Comparator<ListItem> ALPHA = new Comparator<ListItem>() {
108 public int compare(ListItem lhs, ListItem rhs) {
109 return lhs.getTitle().compareTo(rhs.getTitle());
113 public Comparator<ListItem> ALPHAIGNORECASE = new Comparator<ListItem>() {
115 public int compare(ListItem lhs, ListItem rhs) {
116 return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
120 public Comparator<ListItem> NONE = new Comparator<ListItem>() {
122 public int compare(ListItem lhs, ListItem rhs) {
123 return ((Integer)getPosition(lhs)).compareTo(getPosition(rhs));
128 // HashMap<String, MyListAdapter> mAdapters = new HashMap<String, ActivityBaseFragment.MyListAdapter>();
130 public ListItemAdapter ensureHeader(int sectionName) {
131 return ensureHeader(mAdapter.getSectionCount(), getString(sectionName));
134 public ListItemAdapter ensureHeader(String sectionName) {
135 return ensureHeader(mAdapter.getSectionCount(), sectionName);
138 public ListItemAdapter ensureHeader(int index, int sectionName) {
139 return ensureHeader(index, getString(sectionName));
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);
152 public ListItemAdapter getSection(int section) {
153 return getSection(getString(section));
156 public ListItemAdapter getSection(String section) {
157 return mAdapter.getSection(section);
160 public ListItem addItem(int sectionName, ListItem item) {
161 return addItem(getString(sectionName), item);
164 public ListItem addItem(int sectionName, ListItem item, int index) {
165 return addItem(getString(sectionName), item, index);
168 public ListItem addItem(String sectionName, ListItem item) {
169 return addItem(sectionName, item, -1);
172 public int getSectionItemCount(int section) {
173 return getSectionItemCount(getString(section));
176 public int getSectionItemCount(String section) {
177 ListItemAdapter adapter = mAdapter.getSection(section);
180 return adapter.getCount();
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);
192 // mAdapter.notifyDataSetChanged();
196 adapter.insert(item, index);
200 mAdapter.notifyDataSetChanged();
204 public ListItem findItem(int item) {
205 String text = getString(item);
207 for (ListItemAdapter adapter: mAdapter.getSections())
209 for (int i = 0; i < adapter.getCount(); i++) {
210 ListItem li = adapter.getItem(i);
211 if (text.equals(li.getTitle()))
219 private ActivityBaseFragmentListener mListener;
220 public ActivityBaseFragmentListener getListener() {
224 public void setListener(ActivityBaseFragmentListener listener) {
225 mListener = listener;
228 public static interface ActivityBaseFragmentListener {
229 void onCreate(Bundle savedInstanceState, View view);
232 protected void onCreate(Bundle savedInstanceState, View view) {
233 if (mListener != null)
234 mListener.onCreate(savedInstanceState, view);
237 protected int getListFragmentResource() {
238 return R.layout.list_fragment;
241 void onListItemClick(ListItem li) {
245 ViewGroup mTitleContainer;
248 public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
249 View ret = inflater.inflate(getListFragmentResource(), container, false);
251 mTitleContainer = (ViewGroup)ret.findViewById(R.id.title_container);
253 mListView = (ListView)ret.findViewById(R.id.listview);
254 mListView.setOnItemClickListener(new OnItemClickListener() {
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;
261 li.onClickInternal(arg1);
266 mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
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();
279 mListView.setAdapter(mAdapter);
280 mEmpty = (TextView)ret.findViewById(R.id.empty);
282 onCreate(savedInstanceState, ret);
287 public final void onCreate(Bundle savedInstanceState) {
288 super.onCreate(savedInstanceState);
290 mAdapter = new MyAdapter(getActivity());
293 Handler handler = new Handler();
296 public void onDestroy() {
302 protected int getListHeaderResource() {
303 return R.layout.list_header;
306 protected int getListItemResource() {
307 return R.layout.list_item;
310 public void clear() {
314 public void clearSection(int section) {
315 clearSection(mListView.getContext().getString(section));
318 public void clearSection(String section) {
319 ListItemAdapter adapter = mAdapter.getSection(section);
323 mAdapter.notifyDataSetChanged();
326 public void removeSection(int section) {
327 removeSection(mListView.getContext().getString(section));
330 public void removeSection(String section) {
331 mAdapter.removeSection(section);
334 public void removeItem(ListItem item) {
335 for (ListItemAdapter adapter: mAdapter.getSections()) {
336 adapter.remove(item);
338 mAdapter.notifyDataSetChanged();
341 public void setEmpty(int res) {
342 mListView.setEmptyView(mEmpty);
346 public ListView getListView() {
350 public MyAdapter getAdapter() {
354 public ViewGroup getTitleContainer() {
355 return mTitleContainer;