ashur
ashur

Reputation: 4307

CursorLoader does not refresh data

I'm creating application to add movie data via external web service to internal database and display list of movies as the main activity in ListFragment, another activity is responsible for search function.

ListFragment mentioned above fetches data from database using LoaderManager. Also this fragment is retained using setRetainInstance(true).

Problem that I encounter is that when I navigate to search, add something to database, and go back to ListFragment by pressing Back Button its not refreshed i.e. added movie is not displayed.

A few important things:

Here is the code:

package com.mp.movieplanner;

import android.app.Activity;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
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.util.Log;
import android.view.View;
import android.widget.ListView;

import com.mp.movieplanner.data.DataManager;

public class MovieListFragment extends ListFragment
        implements LoaderManager.LoaderCallbacks<Cursor> {

    public static String TAG = MovieListFragment.class.getSimpleName();

    private OnMovieSelectedListener mCallback;  

    private DataManager mDataManager;

    private MovieCursorAdapter mAdapter;

    public interface OnMovieSelectedListener {
        public void onMovieSelected(int position);      
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.i(TAG, "onAttach(Activity)");
        mDataManager = ((MoviePlannerApp)activity.getApplication()).getDataManager();
        try {
            mCallback = (OnMovieSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnMovieSelectedListener");
        }   
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        Log.i(TAG, "onCreate(Bundle)");
        final int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? android.R.layout.simple_list_item_activated_1
                : android.R.layout.simple_list_item_1;

        setRetainInstance(true);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.i(TAG, "onActivityCreated(Bundle)");
        super.onActivityCreated(savedInstanceState);
        mAdapter = new MovieCursorAdapter(getActivity(), null, 0);
        setListAdapter(mAdapter);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.i(TAG, "onStart()");
        if (getFragmentManager().findFragmentById(R.id.movie_details_fragment) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(TAG, "onResume()");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.i(TAG, "onDetach()");
        mCallback = null;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Notify the parent activity of selected item      
        if (mCallback != null) {
            mCallback.onMovieSelected(position);
            // Set the item as checked to be highlighted when in two-pane layout
            getListView().setItemChecked(position, true);
        }
    }


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(getActivity()) {
            @Override
            public Cursor loadInBackground() {
                return mDataManager.getMovieCursor();
            }
        };
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        mAdapter.swapCursor(null);      
    }

      @Override
      public void onPause() {
         Log.i(TAG, "onPause()");
        super.onPause();
      }

      @Override
      public void onStop() {
        Log.i(TAG, "onStop()");
        super.onStop();
      }

      @Override
      public void onDestroy() {
          super.onDestroy();
          Log.i(TAG, "onDestroy()");
      }
}

Upvotes: 2

Views: 648

Answers (2)

Barmaley
Barmaley

Reputation: 16363

I would advise:

@Override
public void onResume() {
    super.onResume();
    Log.i(TAG, "onResume()");
    getLoaderManager().restartLoader(0, null, this);
}

Upvotes: 1

Ramy Sabry
Ramy Sabry

Reputation: 368

@Override
public void onResume() {
    super.onResume();
    Log.i(TAG, "onResume()");
    getLoaderManager().initLoader(0, null, this);
}

try that

Upvotes: 0

Related Questions