Java 游标加载程序不刷新数据

Java 游标加载程序不刷新数据,java,android,android-fragments,loader,android-loadermanager,Java,Android,Android Fragments,Loader,Android Loadermanager,我正在创建一个应用程序,通过外部web服务将电影数据添加到内部数据库,并将电影列表显示为ListFragment中的主要活动,另一个活动负责搜索功能 上面提到的ListFragment使用LoaderManager从数据库获取数据。另外,使用setRetainInstance(true)保留此片段 我遇到的问题是,当我导航到搜索时,向数据库添加一些内容,然后通过按后退按钮返回到列表片段,其未刷新,即未显示添加的电影 一些重要的事情: 我没有使用ContentProvider,所以我在onCre

我正在创建一个应用程序,通过外部web服务将电影数据添加到内部数据库,并将电影列表显示为
ListFragment
中的主要活动,另一个活动负责搜索功能

上面提到的
ListFragment
使用
LoaderManager
从数据库获取数据。另外,使用
setRetainInstance(true)
保留此片段

我遇到的问题是,当我导航到搜索时,向数据库添加一些内容,然后通过按
后退按钮返回到
列表片段
,其未刷新,即未显示添加的电影

一些重要的事情:

  • 我没有使用
    ContentProvider
    ,所以我在
    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()");
      }
}
package com.mp.movieplanner;
导入android.app.Activity;
导入android.database.Cursor;
导入android.os.Build;
导入android.os.Bundle;
导入android.support.v4.app.ListFragment;
导入android.support.v4.app.LoaderManager;
导入android.support.v4.content.CursorLoader;
导入android.support.v4.content.Loader;
导入android.util.Log;
导入android.view.view;
导入android.widget.ListView;
导入com.mp.movieplanner.data.DataManager;
公共类MovieListFragment扩展了ListFragment
实现LoaderManager.LoaderCallbacks{
公共静态字符串标记=MovieListFragment.class.getSimpleName();
private OnMovieSelectedListener mCallback;
私有数据管理器mDataManager;
私人电影改编者;
MovieSelectedListener上的公共接口{
移动时的公共无效已选定(内部位置);
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
Log.i(标签“NANTACH(活动)”);
mDataManager=((MoviePlannerApp)activity.getApplication()).getDataManager();
试一试{
mCallback=(OnMovieSelectedListener)活动;
}catch(ClassCastException e){
抛出新的ClassCastException(activity.toString()
+“必须实现OnMovieSelectedListener”);
}   
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(标记“onCreate(Bundle)”;
最终int布局=Build.VERSION.SDK\u int>=Build.VERSION\u code.Honeycom?android.R.layout.simple\u list\u item\u activated\u 1
:android.R.layout.simple\u list\u item\u 1;
setRetainInstance(真);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
Log.i(标记“onActivityCreated(Bundle)”;
super.onActivityCreated(savedInstanceState);
mAdapter=newmoviecursoradapter(getActivity(),null,0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0,null,this);
}
@凌驾
public void onStart(){
super.onStart();
Log.i(标记“onStart()”);
if(getFragmentManager().findFragmentById(R.id.movie\u details\u fragment)!=null){
getListView().setChoiceMode(ListView.CHOICE\u MODE\u SINGLE);
}
}
@凌驾
恢复时公开作废(){
super.onResume();
Log.i(标记“onResume()”);
}
@凌驾
公共无效连接(){
super.onDetach();
Log.i(标记“onDetach()”);
mCallback=null;
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
//通知所选项目的父活动
如果(mCallback!=null){
mCallback.onMovieSelected(位置);
//将项目设置为选中状态,以便在双窗格布局中高亮显示
getListView().setItemChecked(位置,true);
}
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的游标装入器(getActivity()){
@凌驾
公共游标loadInBackground(){
返回mDataManager.getMovieCursor();
}
};
}
@凌驾
public void onLoadFinished(加载器、光标数据){
mAdapter.swapCursor(数据);
}
@凌驾
公共void onLoaderReset(加载程序arg0){
mAdapter.swapCursor(空);
}
@凌驾
公共无效暂停(){
Log.i(标记“onPause()”);
super.onPause();
}
@凌驾
公共void onStop(){
Log.i(标记“onStop()”);
super.onStop();
}
@凌驾
公共空间{
super.ondestory();
Log.i(标记“onDestroy()”);
}
}
试试看

我建议:

@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().restartLoader(0, null, this);
}