Created
October 30, 2014 14:19
-
-
Save Swimburger/2419576d37c7fef144aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package be.swimberghe.niels.bieren; | |
import android.app.Activity; | |
import android.database.Cursor; | |
import android.database.sqlite.SQLiteDatabase; | |
import android.os.Bundle; | |
import android.support.annotation.Nullable; | |
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.SimpleCursorAdapter; | |
import android.view.View; | |
import android.widget.ListView; | |
import java.util.ArrayList; | |
import be.swimberghe.niels.bieren.data.BeerContract; | |
import be.swimberghe.niels.bieren.data.BeerDbHelper; | |
import be.swimberghe.niels.bieren.model.Beer; | |
/** | |
* A list fragment representing a list of Bieren. This fragment | |
* also supports tablet devices by allowing list items to be given an | |
* 'activated' state upon selection. This helps indicate which item is | |
* currently being viewed in a {@link BierDetailFragment}. | |
* <p> | |
* Activities containing this fragment MUST implement the {@link Callbacks} | |
* interface. | |
*/ | |
public class BierListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { | |
/** | |
* The serialization (saved instance state) Bundle key representing the | |
* activated item position. Only used on tablets. | |
*/ | |
private static final String STATE_ACTIVATED_POSITION = "activated_position"; | |
/** | |
* The fragment's current callback object, which is notified of list item | |
* clicks. | |
*/ | |
private Callbacks mCallbacks = sDummyCallbacks; | |
/** | |
* The current activated item position. Only used on tablets. | |
*/ | |
private int mActivatedPosition = ListView.INVALID_POSITION; | |
private SimpleCursorAdapter mAdapter; | |
private ArrayList<Beer> mBeers; | |
private ArrayList<String> mBrewers; | |
@Override | |
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { | |
return new CursorLoader( getActivity(),null, new String[]{BeerContract.BrewerEntry._ID,BeerContract.BrewerEntry.COLUMN_NAME}, null, null, null ) | |
{ | |
@Override | |
public Cursor loadInBackground() | |
{ | |
// You better know how to get your database. | |
SQLiteDatabase DB = new BeerDbHelper(getActivity()).getReadableDatabase(); | |
// You can use any query that returns a cursor. | |
return DB.query(BeerContract.BrewerEntry.TABLE_NAME, getProjection(), getSelection(), getSelectionArgs(), null, null, getSortOrder(), null ); | |
} | |
}; | |
} | |
@Override | |
public void onLoadFinished(Loader<Cursor> arrayListLoader, Cursor cursor) { | |
mAdapter.swapCursor(cursor); | |
mAdapter.notifyDataSetChanged(); | |
} | |
@Override | |
public void onLoaderReset(Loader<Cursor> loader) { | |
mAdapter.swapCursor(null); | |
mAdapter.notifyDataSetChanged(); | |
} | |
/** | |
* A callback interface that all activities containing this fragment must | |
* implement. This mechanism allows activities to be notified of item | |
* selections. | |
*/ | |
public interface Callbacks { | |
/** | |
* Callback for when an item has been selected. | |
*/ | |
public void onItemSelected(String id); | |
} | |
/** | |
* A dummy implementation of the {@link Callbacks} interface that does | |
* nothing. Used only when this fragment is not attached to an activity. | |
*/ | |
private static Callbacks sDummyCallbacks = new Callbacks() { | |
@Override | |
public void onItemSelected(String id) { | |
} | |
}; | |
/** | |
* Mandatory empty constructor for the fragment manager to instantiate the | |
* fragment (e.g. upon screen orientation changes). | |
*/ | |
public BierListFragment() { | |
} | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
String[] colums = {BeerContract.BrewerEntry.COLUMN_NAME}; | |
int[] ids = {android.R.id.text1}; | |
// TODO: replace with a real list adapter. | |
mBeers= new ArrayList<Beer>(); | |
mBrewers = new ArrayList<String>(); | |
mAdapter = new SimpleCursorAdapter(getActivity(),android.R.layout.simple_list_item_1,null, | |
colums, | |
ids,0); | |
setListAdapter(mAdapter); | |
getLoaderManager().initLoader(0,null,this); | |
} | |
@Override | |
public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |
super.onActivityCreated(savedInstanceState); | |
} | |
@Override | |
public void onViewCreated(View view, Bundle savedInstanceState) { | |
super.onViewCreated(view, savedInstanceState); | |
// Restore the previously serialized activated item position. | |
if (savedInstanceState != null | |
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { | |
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); | |
} | |
} | |
@Override | |
public void onAttach(Activity activity) { | |
super.onAttach(activity); | |
// Activities containing this fragment must implement its callbacks. | |
if (!(activity instanceof Callbacks)) { | |
throw new IllegalStateException("Activity must implement fragment's callbacks."); | |
} | |
mCallbacks = (Callbacks) activity; | |
} | |
@Override | |
public void onDetach() { | |
super.onDetach(); | |
// Reset the active callbacks interface to the dummy implementation. | |
mCallbacks = sDummyCallbacks; | |
} | |
@Override | |
public void onListItemClick(ListView listView, View view, int position, long id) { | |
super.onListItemClick(listView, view, position, id); | |
// Notify the active callbacks interface (the activity, if the | |
// fragment is attached to one) that an item has been selected. | |
Cursor cursor =(Cursor) mAdapter.getItem(position); | |
String brewerName = cursor.getString(cursor.getColumnIndex(BeerContract.BrewerEntry.COLUMN_NAME)); | |
mCallbacks.onItemSelected(brewerName); | |
} | |
@Override | |
public void onSaveInstanceState(Bundle outState) { | |
super.onSaveInstanceState(outState); | |
if (mActivatedPosition != ListView.INVALID_POSITION) { | |
// Serialize and persist the activated item position. | |
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); | |
} | |
} | |
/** | |
* Turns on activate-on-click mode. When this mode is on, list items will be | |
* given the 'activated' state when touched. | |
*/ | |
public void setActivateOnItemClick(boolean activateOnItemClick) { | |
// When setting CHOICE_MODE_SINGLE, ListView will automatically | |
// give items the 'activated' state when touched. | |
getListView().setChoiceMode(activateOnItemClick | |
? ListView.CHOICE_MODE_SINGLE | |
: ListView.CHOICE_MODE_NONE); | |
} | |
private void setActivatedPosition(int position) { | |
if (position == ListView.INVALID_POSITION) { | |
getListView().setItemChecked(mActivatedPosition, false); | |
} else { | |
getListView().setItemChecked(position, true); | |
} | |
mActivatedPosition = position; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment