title: Save a ListView scroll position when navigating from list to detail
body: <p>i'm using a custom ArrayAdapter to show my listView ,i click on item and navigate to detail activitivity , all it's working fine , but when i go back to my listView it's getting scrolling to top, i'm using the master detail flow generated by Android ( i just costumized the listView and detailView )</p>
  
  <p>here is my costum arrayAdapter :</p>
  
  <pre><code>public class MyAdapter extends ArrayAdapter&lt;DummyContent.DummyItem&gt; {
  
  private final Context context;
  private final List&lt;DummyContent.DummyItem&gt; values;
  
  public MyAdapter(Context context, List&lt;DummyContent.DummyItem&gt; values) {
      super(context, R.layout.list_item , values);
      this.context = context;
      this.values = values;
  }
  
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
      View rowView = convertView;
      if(rowView == null){
          LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          rowView = inflater.inflate(R.layout.list_item, parent, false);
          TextView textViewTitre = (TextView) rowView.findViewById(R.id.titre);
          TextView textViewSC = (TextView) rowView.findViewById(R.id.sc);
          textViewTitre.setText(values.get(position).titre);
          textViewSC.setText(values.get(position).sctitre);
      }
  
      return rowView;
  }
  public void refill(List&lt;DummyContent.DummyItem&gt; events) {
      values.clear();
      values.addAll(events);
      notifyDataSetChanged();
  }
  </code></pre>
  
  <p>and here is my ListFragment class :</p>
  
  <pre><code>public class EventListFragment extends ListFragment {
  
  /**
   * 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;
  
  /**
   * 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 EventListFragment() {
  }
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
  
      MyAdapter adapter = new MyAdapter(getActivity(), DummyContent.ITEMS);
      setListAdapter(adapter);
  }
  
  @Override
  public void onViewCreated(View view, Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);
  
      // Restore the previously serialized activated item position.
      if (savedInstanceState != null
              &amp;&amp; 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.
      mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
  }
  
  @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;
  }
  </code></pre>
  
  <p>and my MainActivity :</p>
  
  <pre><code>protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
  
          new LoadEvents().execute();
  }
  
  /**
   * Callback method from {@link EventListFragment.Callbacks} indicating that
   * the item with the given ID was selected.
   */
  @Override
  public void onItemSelected(String id) {
      if (mTwoPane) {
          // In two-pane mode, show the detail view in this activity by
          // adding or replacing the detail fragment using a
          // fragment transaction.
          Bundle arguments = new Bundle();
          arguments.putString(EventDetailFragment.ARG_ITEM_ID, id);
          EventDetailFragment fragment = new EventDetailFragment();
          fragment.setArguments(arguments);
          getSupportFragmentManager().beginTransaction()
                  .replace(R.id.event_detail_container, fragment).commit();
  
      } else {
          // In single-pane mode, simply start the detail activity
          // for the selected item ID.
          Intent detailIntent = new Intent(this, EventDetailActivity.class);
          detailIntent.putExtra(EventDetailFragment.ARG_ITEM_ID, id);
          startActivity(detailIntent);
      }
  }
  
  class LoadEvents extends AsyncTask&lt;String, String, String&gt; {
  
      /**
       * Aficher le sabiler avant l'opreration
       * */
      @Override
      protected void onPreExecute() {
          super.onPreExecute();
          pDialog = new ProgressDialog(EventListActivity.this);
          pDialog.setMessage("Wait...");
          pDialog.show();
      }
  
      /**
       * recuperer la liste des events
       * */
      protected String doInBackground(String... args) {
          // Creation des Parameteres
          List&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();
          // JSON string à partir du URL
          JSONObject json = jParser.makeHttpRequest(
                  AgendaIConstantes.URL_EVENTS, "GET", params);
  
          ..... processing here
                      DummyContent.ITEMS.add(item);
                      DummyContent.ITEM_MAP.put(item.id, item);
                  }
              } else {
              }
          } catch (JSONException e) {
              e.printStackTrace();
          }
  
          return null;
      }
  
      protected void onPostExecute(String file_url) {
          // masquer le progress dialog
          pDialog.dismiss();
  
          setContentView(R.layout.activity_event_list);
  
          if (findViewById(R.id.event_detail_container) != null) {
              // The detail container view will be present only in the
              // large-screen layouts (res/values-large and
              // res/values-sw600dp). If this view is present, then the
              // activity should be in two-pane mode.
              mTwoPane = true;
  
              // In two-pane mode, list items should be given the
              // 'activated' state when touched.
              ((EventListFragment) getSupportFragmentManager()
                      .findFragmentById(R.id.event_list))
                      .setActivateOnItemClick(true);
          }
  
      }
  }
  </code></pre>