package co.mwater.clientapp.ui; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import co.mwater.clientapp.R; import com.actionbarsherlock.app.SherlockFragment; public abstract class SeeMoreListFragment extends SherlockFragment { private CursorAdapter adapter; private Observer observer; Handler handler; int maxItems = 3; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); observer = new Observer(handler); adapter = createAdapter(); requery(); } private void requery() { // Unregister any listeners getActivity().getContentResolver().unregisterContentObserver(observer); Cursor cursor = performQuery(); cursor.registerContentObserver(observer); adapter.changeCursor(cursor); // Register any additional listeners Uri[] uris = getExtraWatchUris(); for (Uri uri : uris) { getActivity().getContentResolver().registerContentObserver(uri, true, observer); } } @Override public void onDestroy() { // Unregister any listeners getActivity().getContentResolver().unregisterContentObserver(observer); Cursor cursor = adapter.getCursor(); if (cursor != null) { // TODO needed? cursor.unregisterContentObserver(observer); adapter.changeCursor(null); } super.onDestroy(); } protected abstract CursorAdapter createAdapter(); protected abstract Cursor performQuery(); protected abstract void seeAllClicked(); protected Uri[] getExtraWatchUris() { return new Uri[0]; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.see_more_list, container, false); ((TextView) view.findViewById(R.id.seeAll)).setOnClickListener(new OnClickListener() { public void onClick(View v) { seeAllClicked(); } }); // Fill list fillList(view); return view; } private void fillList(View view) { if (view == null) return; LinearLayout listLayout = (LinearLayout) view.findViewById(R.id.list); if (listLayout == null) return; listLayout.removeAllViews(); addDivider(listLayout); Cursor cursor = adapter.getCursor(); if (cursor == null) return; // Set visibility of See All view.findViewById(R.id.seeAll).setVisibility(cursor.getCount() > maxItems ? View.VISIBLE : View.GONE); for (int i = 0; i < adapter.getCount() && i < maxItems; i++) { View itemContents = adapter.getView(i, null, listLayout); FrameLayout item = new FrameLayout(getActivity()); item.addView(itemContents); item.setClickable(true); item.setBackgroundResource(R.drawable.borderless_button_background); cursor.moveToPosition(i); final long id = cursor.getLong(cursor.getColumnIndex("_id")); item.setOnClickListener(new OnClickListener() { public void onClick(View v) { onItemClick(id); } }); listLayout.addView(item); addDivider(listLayout); } } abstract protected void onItemClick(long id); // private void clearList() { // LinearLayout listLayout = // (LinearLayout)getView().findViewById(R.id.list); // listLayout.removeAllViews(); // addDivider(listLayout); // } private void addDivider(LinearLayout listLayout) { ImageView divider = new ImageView(getActivity()); divider.setScaleType(ImageView.ScaleType.FIT_XY); divider.setImageResource(R.drawable.divider); listLayout.addView(divider); } private class Observer extends ContentObserver { public Observer(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); requery(); fillList(getView()); } } }