gpt4 book ai didi

java - CursorLoader 不刷新数据

转载 作者:行者123 更新时间:2023-11-30 11:17:05 26 4
gpt4 key购买 nike

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

上面提到的

ListFragment 使用 LoaderManager 从数据库中获取数据。此 fragment 还使用 setRetainInstance(true) 保留。

我遇到的问题是,当我导航到搜索、向数据库添加内容并通过按 后退按钮 返回到 ListFragment 时,它没有刷新,即添加的电影是不显示。

一些重要的事情:

  • 我没有使用 ContentProvider,所以我在 onCreateLoaderMethod 中手动从我的数据库中检索 Cursor。
  • 我正在使用支持库 - 我希望所有导入都是正确的(如果有人可以检查的话)。
  • ListFragment 使用自定义 CursorAdapter 作为其 View 。

代码如下:

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

最佳答案

我会建议:

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

关于java - CursorLoader 不刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com