title: Android CursorAdapter not refreshing on first load
body: <p>EDIT I didn't add my XML</p>
  
  <p>I am writing a dialog for tagging selections. The first view is applying tags they have in their db.  The next screen is a dialog for adding new tags to their db. I am supplying suggestions for them to use for their tags.  I want to filter the list when they begin typing in their tag.  I am using two custom CursorAdapters for each screen but they share the same ListView. I am also using a CursorLoader to run my queries in the background both are extended from the support library.</p>
  
  <p>When I open the new tag screen the first time, after the dialog comes up, the list doesn't refresh with the filtered cursor in Android 4.0.3 nor does the quick scroll work. If I switch to the tag view and then back to the new tag dialog it filters and scrolls like it should.. My query works and the code works in Android 2.3.3 every time. I can't figure out why this is not working. Here is my code for the CursorLoader and the Suggestion adapter.</p>
  
  <pre><code>package org.lds.ldssa;
  
  import android.app.AlertDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.res.Resources;
  import android.database.Cursor;
  import android.os.Bundle;
  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.text.Editable;
  import android.text.TextWatcher;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.inputmethod.InputMethodManager;
  import android.widget.*;
  import org.lds.ldssa.service.MLDatabase;
  import org.lds.ldssa.service.aws.Annotation;
  
   public class TagDialog extends AlertDialog implements LoaderManager.LoaderCallbacks&lt;Cursor&gt; {
  
  private static final String TAG = "ldssa.tagdialog";
  public static final int TAGLOADERID = 0;
  
  // View Items
  private EditText mEditText;
  private ListView mListView;
  private TextView mEmptyView;
  private ProgressBar mProgressBar;
  private ImageButton mNewTagButton;
  private ImageButton mSortTagButton;
  private TextView mTitle;
  private Button mOkButton;
  private Button mCancelButton;
  private String mTagTitle;
  private String mNewTagTitle;
  
  private Annotation mAnnotation;
  private ContentFragment mContentFragment;
  
  private boolean isNewTagView;
  private static final String KEY_NEWTAGVIEW = "new_tag_view";
  private SimpleCursorAdapter mSuggestionAdapter;
  private TagListAdapter mTagAdapter;
  
  private MLDatabase mlDatabase;
  
  protected TagDialog(Context context) {
      super(context);
  }
  
  public void onCreate(Bundle savedInstanceState){
      Context context = getContext();
      Resources r = context.getResources();
  
      final LayoutInflater inflater = LayoutInflater.from(context);
      View view = inflater.inflate(R.layout.dialog_tag, null);
  
      // Main parts of the view        
      mEditText = (EditText) view.findViewById(R.id.tag_new_tag);
      mListView = (ListView) view.findViewById(android.R.id.list);
      mProgressBar = (ProgressBar) view.findViewById(R.id.tag_spin_progress_bar);
      mEmptyView = (TextView) view.findViewById(android.R.id.empty);
      mEmptyView.setVisibility(View.INVISIBLE);
  
      // Titlebar
      View titleBar = inflater.inflate(R.layout.dialog_tag_title, null);
      mNewTagButton = (ImageButton) titleBar.findViewById(R.id.tag_new_icon);
      mSortTagButton = (ImageButton) titleBar.findViewById(R.id.tag_sort_icon);
      mTitle = (TextView) titleBar.findViewById(R.id.tag_title);
      mTagTitle = r.getString(R.string.tag_dialog_title);
      mNewTagTitle = r.getString(R.string.tag_new_dialog_title);
      this.setCustomTitle(titleBar);
  
      // Buttons
      final String OK = r.getString(R.string.ok);
      final String CANCEL = r.getString(R.string.cancel);
      this.setButton(BUTTON_POSITIVE, OK, new OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) { /*Never Used*/}});
      this.setButton(BUTTON_NEGATIVE, CANCEL, new OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) { /*Never Used*/}});
  
      // Setup Button Listeners
      setOnShowListener(new OnShowListener() {
          @Override
          public void onShow(DialogInterface dialog) {
              Button ok = getButton(BUTTON_POSITIVE);
              ok.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if(isNewTagView){
                          hideIMM();
                          setupTagDialog();
                          mEditText.setText("");
                      } else {
                          dismiss();
                      }
                  }
              });
  
              Button cancel = getButton(BUTTON_NEGATIVE);
              cancel.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if(isNewTagView){
                          hideIMM();
                          setupTagDialog();
                          mEditText.setText("");
                      } else {
                          dismiss();
                      }
                  }
              });
          }
      });
  
      mNewTagButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              setupNewTagDialog();
          }
      });
      mSortTagButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
  
          }
      });
  
      mEditText.addTextChangedListener(new TextWatcher() {
          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
  
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {}
  
          @Override
          public void afterTextChanged(Editable s) {
             LoaderManager lm = getLoaderManager();
              if(lm != null){
                  Loader l = lm.getLoader(TAGLOADERID);
                  if(l != null){
                      l.forceLoad();
                  } else {
                      restartLoader();
                  }
              } else {
                  restartLoader();
              }
          }
      });
      String[] UIBindFrom = {MLDatabase.CL_ID};
      int[] UIBindTo = {android.R.id.text1};
      mTagAdapter = new TagListAdapter(context, null);
      mSuggestionAdapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, null,
              UIBindFrom, UIBindTo, 0);
  
      //Handle Rotations
      if(savedInstanceState == null){
          //New
          setupTagDialog();
      } else {
          //rotated
          isNewTagView = savedInstanceState.getBoolean(KEY_NEWTAGVIEW, false);
          if(isNewTagView){
              restoreTagState(savedInstanceState);
          } else {
              restoreNewTagState(savedInstanceState);
          }
      }
  
      LoaderManager lm = getLoaderManager();
      if(lm != null){
          lm.initLoader(TAGLOADERID, null, this);
      }
  
      this.setView(view);
      super.onCreate(savedInstanceState);
  }
  
  public void onStart(){
      restartLoader();
  }
  
  @Override
  public Bundle onSaveInstanceState(){
      Bundle bundle = super.onSaveInstanceState();
  
      bundle.putBoolean(KEY_NEWTAGVIEW, isNewTagView);
  
      return bundle;
  }
  
  @Override
  public void onBackPressed(){
      if(isNewTagView){
          hideIMM();
          setupTagDialog();
      } else {
          this.dismiss();
      }
  }
  
  private void setupTagDialog() {
      isNewTagView = false;
      mTitle.setText(mTagTitle);
      mNewTagButton.setVisibility(View.VISIBLE);
      mSortTagButton.setVisibility(View.VISIBLE);
      mEditText.setVisibility(View.GONE);
      mListView.setVisibility(View.GONE);
      mProgressBar.setVisibility(View.VISIBLE);
      mListView.setAdapter(mTagAdapter);
      restartLoader();
  }
  
  private void setupNewTagDialog() {
      isNewTagView = true;
      mTitle.setText(mNewTagTitle);
      mNewTagButton.setVisibility(View.INVISIBLE);
      mSortTagButton.setVisibility(View.INVISIBLE);
      mEditText.setVisibility(View.VISIBLE);
      mListView.setVisibility(View.GONE);
      mProgressBar.setVisibility(View.VISIBLE);
      mListView.setAdapter(mSuggestionAdapter);
      restartLoader();
  }
  
  private void restoreTagState(Bundle bundle) {
      setupTagDialog();
  }
  
  private void restoreNewTagState(Bundle bundle) {
      setupNewTagDialog();
  }
  
  public void setAnnotation(Annotation a) {
      mAnnotation = a;
  }
  
  public void setContentViewInterface(ContentFragment contentFragment) {
      mContentFragment = contentFragment;
  }
  
  private MLDatabase getDatabase() {
      if(mlDatabase == null){
          GospelLibraryApplication app = (GospelLibraryApplication) getContext().getApplicationContext();
          mlDatabase = app.getMlDatabase();
      }
      return mlDatabase;
  }
  
  public String getFilter() {
      return mEditText.getText().toString().trim();
  }
  
  public Integer getAnnotationID(){
      if(mAnnotation != null){
          return mAnnotation.getDbKey();
      }
      return -1;
  }
  
  private LoaderManager getLoaderManager(){
      if(mContentFragment == null){
          Log.d(TAG, "ContentFragment is NULL!");
          return null;
      }
      return mContentFragment.getContentActivity().getSupportLoaderManager();
  }
  
  private void restartLoader(){
      LoaderManager lm = getLoaderManager();
      if(lm != null){
          lm.restartLoader(TAGLOADERID, null, this);
      }
  }
  
  private void hideIMM(){
      InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
  }
  
  @Override
  public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
      TagCursorLoader loader = new TagCursorLoader(getContext(), this);
      return loader;
  }
  
  @Override
  public void onLoadFinished(Loader&lt;Cursor&gt; cursorLoader, Cursor data) {
      if(isNewTagView) {
          mSuggestionAdapter.changeCursor(data);
      } else {
          mTagAdapter.changeCursor(data);
      }
      mListView.invalidateViews();
      mProgressBar.setVisibility(View.GONE);
      mListView.setVisibility(View.VISIBLE);
  }
  
  @Override
  public void onLoaderReset(Loader&lt;Cursor&gt; cursorLoader) {
      if(mSuggestionAdapter != null) {
          mSuggestionAdapter.changeCursor(null);
      }
  }
  
  public static class TagCursorLoader extends CursorLoader {
      private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
  
      private TagDialog dialog;
      private MLDatabase mlDatabase;
      private Cursor mCursor;
      private String mFilter;
      private Integer mAnnotationID;
  
      // Runs on worker thread
      @Override
      public Cursor loadInBackground(){
          Cursor cursor = null;
          if(dialog.isNewTagView){
              mFilter = dialog.getFilter();
              cursor = mlDatabase.getTagSuggestions(mFilter);
          } else {
              mAnnotationID = dialog.getAnnotationID();
          }
  
          if(cursor != null){
              cursor.registerContentObserver(mObserver);
          }
  
          return cursor;
  
      }
  
      //Runs on UI thread
      @Override
      public void deliverResult(Cursor cursor){
          //Handle if canceled in the middle.
          if(isReset()){
              if(cursor != null){
                  cursor.close();
              }
              return;
          }
  
          Cursor oldCursor = mCursor;
          mCursor = cursor;
          if(isStarted()) {
              super.deliverResult(cursor);
          }
  
          if(oldCursor != null &amp;&amp; !oldCursor.equals(cursor) &amp;&amp; !oldCursor.isClosed()) {
              oldCursor.close();
          }
      }
  
      public TagCursorLoader(Context context, TagDialog dialog) {
          super(context);
          this.dialog = dialog;
          mlDatabase = dialog.getDatabase();
      }
  
      @Override
      public void onStartLoading(){
          if(mCursor == null) {
              forceLoad();
          } else {
              if(dialog.isNewTagView &amp;&amp; mFilter.equals(dialog.getFilter())) {
                  deliverResult(mCursor);
              } else {
                  forceLoad();
              }
          }
      }
  
      @Override
      protected void onStopLoading() {
          // Attempt to cancel the current load task if possible.
          cancelLoad();
      }
  
      @Override
      public void onCanceled(Cursor cursor) {
          if (cursor != null &amp;&amp; !cursor.isClosed()) {
              cursor.close();
          }
      }
  
      @Override
      protected void onReset() {
          super.onReset();
  
          // Ensure the loader is stopped
          onStopLoading();
  
          if (mCursor != null &amp;&amp; !mCursor.isClosed()) {
              mCursor.close();
          }
          mCursor = null;
      }
    }
  }
  
  package org.lds.ldssa;
  
  import android.R;
  import android.content.Context;
  import android.database.Cursor;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.support.v4.widget.CursorAdapter;
  import android.widget.TextView;
  import org.lds.ldssa.service.MLDatabase;
  
  
  public class TagSuggestionAdapter extends CursorAdapter {
  
      public TagSuggestionAdapter(Context context, Cursor cursor, int flags){
          super(context, cursor, flags);
      }
  
      @Override
      public View newView(Context context, Cursor cursor, ViewGroup parent) {
          LayoutInflater inflater = LayoutInflater.from(context);
          View v = inflater.inflate(R.layout.simple_list_item_1, parent, false);
          bindView(v, context, cursor);
          return v;
      }
  
      @Override
      public void bindView(View view, Context context, Cursor cursor) {
          TextView tv = (TextView) view.findViewById(R.id.text1);
          tv.setText(cursor.getString(cursor.getColumnIndex(MLDatabase.CL_ID)));
      }
  }
  </code></pre>
  
  <p>Thanks in Advance for any help.</p>
  
  <p>XML</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/tag_layout"
      android:orientation="vertical"
      android:layout_height="wrap_content"
      android:layout_width="@dimen/min_dialog_width"
      android:padding="5dp"
      android:animateLayoutChanges="true"
      &gt;
  
  &lt;!-- Here is the view to show if the list is emtpy --&gt;
  &lt;TextView
          android:id="@android:id/empty"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:padding="50dp"
          android:textAppearance="?android:attr/textAppearanceMedium"
          android:layout_centerInParent="true"
          android:gravity="center"
          android:text="@string/no_items"
          android:visibility="invisible"
          /&gt;
  
  &lt;ListView
          android:id="@android:id/list"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:visibility="invisible"
          /&gt;
  
  &lt;ProgressBar
          android:id="@+id/tag_spin_progress_bar"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerInParent="true"
          android:indeterminate="true"
          /&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>