1 package ${packageName}; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.support.v4.app.ListFragment; 6 import android.view.View; 7 import android.widget.ArrayAdapter; 8 import android.widget.ListView; 9 10 import ${packageName}.dummy.DummyContent; 11 12 /** 13 * A list fragment representing a list of ${objectKindPlural}. This fragment 14 * also supports tablet devices by allowing list items to be given an 15 * 'activated' state upon selection. This helps indicate which item is 16 * currently being viewed in a {@link ${DetailName}Fragment}. 17 * <p> 18 * Activities containing this fragment MUST implement the {@link Callbacks} 19 * interface. 20 */ 21 public class ${CollectionName}Fragment extends ListFragment { 22 23 /** 24 * The serialization (saved instance state) Bundle key representing the 25 * activated item position. Only used on tablets. 26 */ 27 private static final String STATE_ACTIVATED_POSITION = "activated_position"; 28 29 /** 30 * The fragment's current callback object, which is notified of list item 31 * clicks. 32 */ 33 private Callbacks mCallbacks = sDummyCallbacks; 34 35 /** 36 * The current activated item position. Only used on tablets. 37 */ 38 private int mActivatedPosition = ListView.INVALID_POSITION; 39 40 /** 41 * A callback interface that all activities containing this fragment must 42 * implement. This mechanism allows activities to be notified of item 43 * selections. 44 */ 45 public interface Callbacks { 46 /** 47 * Callback for when an item has been selected. 48 */ 49 public void onItemSelected(String id); 50 } 51 52 /** 53 * A dummy implementation of the {@link Callbacks} interface that does 54 * nothing. Used only when this fragment is not attached to an activity. 55 */ 56 private static Callbacks sDummyCallbacks = new Callbacks() { 57 @Override 58 public void onItemSelected(String id) { 59 } 60 }; 61 62 /** 63 * Mandatory empty constructor for the fragment manager to instantiate the 64 * fragment (e.g. upon screen orientation changes). 65 */ 66 public ${CollectionName}Fragment() { 67 } 68 69 @Override 70 public void onCreate(Bundle savedInstanceState) { 71 super.onCreate(savedInstanceState); 72 73 // TODO: replace with a real list adapter. 74 setListAdapter(new ArrayAdapter<DummyContent.DummyItem>( 75 getActivity(), 76 android.R.layout.simple_list_item_activated_1, 77 android.R.id.text1, 78 DummyContent.ITEMS)); 79 } 80 81 @Override 82 public void onViewCreated(View view, Bundle savedInstanceState) { 83 super.onViewCreated(view, savedInstanceState); 84 85 // Restore the previously serialized activated item position. 86 if (savedInstanceState != null 87 && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { 88 setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); 89 } 90 } 91 92 @Override 93 public void onAttach(Activity activity) { 94 super.onAttach(activity); 95 96 // Activities containing this fragment must implement its callbacks. 97 if (!(activity instanceof Callbacks)) { 98 throw new IllegalStateException("Activity must implement fragment's callbacks."); 99 } 100 101 mCallbacks = (Callbacks) activity; 102 } 103 104 @Override 105 public void onDetach() { 106 super.onDetach(); 107 108 // Reset the active callbacks interface to the dummy implementation. 109 mCallbacks = sDummyCallbacks; 110 } 111 112 @Override 113 public void onListItemClick(ListView listView, View view, int position, long id) { 114 super.onListItemClick(listView, view, position, id); 115 116 // Notify the active callbacks interface (the activity, if the 117 // fragment is attached to one) that an item has been selected. 118 mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id); 119 } 120 121 @Override 122 public void onSaveInstanceState(Bundle outState) { 123 super.onSaveInstanceState(outState); 124 if (mActivatedPosition != ListView.INVALID_POSITION) { 125 // Serialize and persist the activated item position. 126 outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); 127 } 128 } 129 130 /** 131 * Turns on activate-on-click mode. When this mode is on, list items will be 132 * given the 'activated' state when touched. 133 */ 134 public void setActivateOnItemClick(boolean activateOnItemClick) { 135 // When setting CHOICE_MODE_SINGLE, ListView will automatically 136 // give items the 'activated' state when touched. 137 getListView().setChoiceMode(activateOnItemClick 138 ? ListView.CHOICE_MODE_SINGLE 139 : ListView.CHOICE_MODE_NONE); 140 } 141 142 private void setActivatedPosition(int position) { 143 if (position == ListView.INVALID_POSITION) { 144 getListView().setItemChecked(mActivatedPosition, false); 145 } else { 146 getListView().setItemChecked(position, true); 147 } 148 149 mActivatedPosition = position; 150 } 151 } 152