CursorLoader не обновляет данные

Я создаю приложение для добавления данных фильма через внешний веб-сервис во внутреннюю базу данных и отображения списка фильмов в качестве основного действия в ListFragmentдругая функция отвечает за функцию поиска.

ListFragment упомянутое выше выбирает данные из базы данных, используя LoaderManager, Также этот фрагмент сохраняется с помощью setRetainInstance(true),

Проблема, с которой я сталкиваюсь, заключается в том, что когда я перехожу к поиску, добавляю что-то в базу данных и возвращаюсь к ListFragment нажав Back Button его не обновляется, т.е. добавленный фильм не отображается.

Несколько важных вещей:

  • Я не пользуюсь ContentProvider поэтому я вручную получаю Cursor из моей базы данных в onCreateLoaderMethod,
  • Я пользуюсь библиотекой поддержки - надеюсь, что все операции импорта выполнены правильно (если кто-то может проверить)
  • ListFragment использует обычай CursorAdapter как его мнение.

Вот код:

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()");
      }
}

2 ответа

Я бы посоветовал:

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

Попробуй это

Другие вопросы по тегам