package com.kuxhausen.huemore; import android.database.Cursor; import android.os.Bundle; import android.provider.BaseColumns; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import com.kuxhausen.huemore.persistence.Definitions; import com.kuxhausen.huemore.persistence.Definitions.InternalArguments; import com.kuxhausen.huemore.persistence.Definitions.NetBulbColumns; import com.kuxhausen.huemore.state.Group; import com.kuxhausen.huemore.state.SyntheticGroup; import java.util.ArrayList; public class BulbListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, SelectableList { private static final int BULBS_LOADER = 0; private static final String[] columns = {NetBulbColumns.NAME_COLUMN, NetBulbColumns.DEVICE_ID_COLUMN, BaseColumns._ID}; private CursorAdapter mDataSource; private TextView mSelected, mLongSelected; // updated on long click private int mSelectedPos = -1; private NavigationDrawerActivity mParent; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mParent = (NavigationDrawerActivity) getActivity(); int layout = android.R.layout.simple_list_item_activated_1; getLoaderManager().initLoader(BULBS_LOADER, null, this); mDataSource = new SimpleCursorAdapter(getActivity(), layout, null, columns, new int[]{android.R.id.text1}, 0); setListAdapter(mDataSource); // Inflate the layout for this fragment View myView = inflater.inflate(R.layout.bulb_view, null); return myView; } @Override public void onStart() { super.onStart(); getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); mParent.trackSelectableList(this); } @Override public void onStop() { super.onStop(); mParent.forgetSelectableList(this); } public void invalidateSelection() { // Set the previous selected item as checked to be unhighlighted when in // two-pane layout if (mSelected != null && mSelectedPos > -1) { getListView().setItemChecked(mSelectedPos, false); } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); mLongSelected = (TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView; android.view.MenuInflater inflater = this.getActivity().getMenuInflater(); inflater.inflate(R.menu.context_bulb, menu); } @Override public boolean onContextItemSelected(android.view.MenuItem item) { if (mLongSelected == null) { return false; } switch (item.getItemId()) { case R.id.contextgroupmenu_rename: // <-- your custom menu item id here AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); EditBulbDialogFragment ngdf = new EditBulbDialogFragment(); Bundle args = new Bundle(); args.putLong(InternalArguments.NET_BULB_DATABASE_ID, info.id); ngdf.setArguments(args); ngdf.show(getFragmentManager(), InternalArguments.FRAG_MANAGER_DIALOG_TAG); default: return super.onContextItemSelected(item); } } @Override public void onListItemClick(ListView l, View v, int position, long id) { mSelected = ((TextView) (v)); mSelectedPos = position; ArrayList<Long> bulbIds = new ArrayList<Long>(); bulbIds.add(mDataSource.getItemId(position)); Group g = new SyntheticGroup(bulbIds, mSelected.getText().toString()); mParent.setGroup(g, this); // Set the item as checked to be highlighted when in two-pane layout getListView().setItemChecked(mSelectedPos, true); } @Override public Loader<Cursor> onCreateLoader(int loaderID, Bundle arg1) { /* * Takes action based on the ID of the Loader that's being created */ switch (loaderID) { case BULBS_LOADER: // Returns a new CursorLoader return new CursorLoader(getActivity(), // Parent activity context Definitions.NetBulbColumns.URI, // Table columns, // Projection to return null, // No selection clause null, // No selection arguments null // Default sort order ); default: // An invalid id was passed in return null; } } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) { /* * Moves the query results into the adapter, causing the ListView fronting this adapter to * re-display */ mDataSource.changeCursor(cursor); registerForContextMenu(getListView()); } @Override public void onLoaderReset(Loader<Cursor> arg0) { /* * Clears out the adapter's reference to the Cursor. This prevents memory leaks. */ // unregisterForContextMenu(getListView()); mDataSource.changeCursor(null); } }