Android 按下后退按钮时,光标加载程序应重新启动
我有一个listFragment,当单击列表中的一项时,它会启动一个新的活动。当按下后退按钮时,列表再次显示。我正在使用光标加载器,所以,我想知道当按下后退按钮时,是否有一种简单的方法来刷新光标加载器。这是因为新活动会更改列表的内容 编辑:Android 按下后退按钮时,光标加载程序应重新启动,android,android-cursorloader,Android,Android Cursorloader,我有一个listFragment,当单击列表中的一项时,它会启动一个新的活动。当按下后退按钮时,列表再次显示。我正在使用光标加载器,所以,我想知道当按下后退按钮时,是否有一种简单的方法来刷新光标加载器。这是因为新活动会更改列表的内容 编辑: public class ListWordFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private
public class ListWordFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static String TAG = ListWordFragment.class.getSimpleName();
private CursorLoader cursorLoader;
// Loader
private static final int URL_LOADER = 0;
private SimpleCursorAdapter adapter;
public static LoaderManager mLoaderManager;
// ActionBar
private AutoCompleteTextView autoCompView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_list_words, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ListView list = getListView();
String[] from = new String[] { Word.NAME, Word.TYPE, Word.TRANSLATE };
int[] to = new int[] { R.id.textView_word, R.id.textView_type,
R.id.textView_translate };
adapter = new ListWordAdapter(getSherlockActivity(),
R.layout.row_list_words, null, from, to, 0);
setListAdapter(adapter);
mLoaderManager = getLoaderManager();
mLoaderManager.initLoader(URL_LOADER, null, this);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
fillRow(l, id, position, false);
}
private void fillRow(ListView l, long ide, int position, boolean firstCall) {
Cursor cursor = getActivity().getContentResolver().query(
Uri.withAppendedPath(WordListProvider.WORDS_CONTENT_URI,
String.valueOf(ide)), null, null, null, null);
if(cursor.moveToFirst()){
String id = cursor.getString(cursor.getColumnIndex(Word.ID));
String name = cursor.getString(cursor.getColumnIndex(Word.NAME));
String type = cursor.getString(cursor.getColumnIndex(Word.TYPE));
String translate = cursor.getString(cursor
.getColumnIndex(Word.TRANSLATE));
String example = cursor.getString(cursor.getColumnIndex(Word.EXAMPLE));
String note = cursor.getString(cursor.getColumnIndex(Word.NOTE));
// Master/Detail
if ((getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
&& (getResources().getString(R.string.selected_configuration)
.equals(Constants.CONFIGURATION_LARGE))) {
WordDetailFragment frag = (WordDetailFragment) getFragmentManager()
.findFragmentById(R.id.word_detail_fragment);
if (frag != null) {
frag.setId(id);
frag.setName(name);
frag.setType(type);
frag.setTranslate(translate);
frag.setExample(example);
frag.setNote(note);
}
} else if (firstCall) {
// Do nothing
} else {
Intent i = new Intent(getActivity().getApplicationContext(),
WordDetailActivity.class);
i.putExtra(Word.ID, id);
i.putExtra(Word.NAME, name);
i.putExtra(Word.TYPE, type);
i.putExtra(Word.TRANSLATE, translate);
i.putExtra(Word.EXAMPLE, example);
i.putExtra(Word.NOTE, note);
startActivity(i);
}
cursor.close();
}
}
public void onWordSaved() {
getLoaderManager().restartLoader(URL_LOADER, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {
String[] projection = { Word.ID, Word.NAME, Word.TYPE, Word.TRANSLATE,
Word.EXAMPLE, Word.NOTE };
/* Takes action based on the ID of the Loader that's being created */
switch (loaderID) {
case URL_LOADER:
// Returns a new CursorLoader
cursorLoader = new CursorLoader(getSherlockActivity(), // Parent
// activity
// context
WordListProvider.WORDS_CONTENT_URI, // Table to query
projection, // Projection to return
null, // No selection clause
null, // No selection arguments
null // Default sort order
);
return cursorLoader;
default:
// An invalid id was passed in
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
公共类ListWordFragment扩展SherlockListFragment实现LoaderManager.LoaderCallbacks{
私有静态字符串标记=ListWordFragment.class.getSimpleName();
私有游标装入器游标装入器;
//装载机
私有静态final int URL_LOADER=0;
专用SimpleCursorAdapter适配器;
公共静态LoaderManager MLLoaderManager;
//操作栏
私有自动完成文本视图自动完成视图;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
返回充气机。充气(R.layout.fragment\u list\u words,空);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
ListView list=getListView();
String[]from=新字符串[]{Word.NAME、Word.TYPE、Word.TRANSLATE};
int[]to=new int[]{R.id.textView_word,R.id.textView_type,
R.id.textView_translate};
adapter=新ListWordAdapter(getSherlockActivity(),
R.layout.row_list_words,null,from,to,0);
setListAdapter(适配器);
MLLoaderManager=getLoaderManager();
initLoader(URL_LOADER,null,this);
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
super.onListItemClick(左、右、位置、id);
fillRow(l,id,位置,false);
}
私有void fillRow(列表视图l、长ide、int位置、布尔值firstCall){
游标游标=getActivity().getContentResolver().query(
withAppendedPath(WordListProvider.WORDS\u CONTENT\u Uri,
字符串.valueOf(ide)),null,null,null,null);
if(cursor.moveToFirst()){
字符串id=cursor.getString(cursor.getColumnIndex(Word.id));
字符串名称=cursor.getString(cursor.getColumnIndex(Word.name));
字符串类型=cursor.getString(cursor.getColumnIndex(Word.type));
String translate=cursor.getString(游标
.getColumnIndex(Word.TRANSLATE));
字符串示例=cursor.getString(cursor.getColumnIndex(Word.example));
字符串注释=cursor.getString(cursor.getColumnIndex(Word.note));
//主/细节
if((getResources().getConfiguration().orientation==Configuration.orientation\u横向)
&&(getResources().getString(R.string.selected_配置)
.equals(常数.CONFIGURATION_LARGE))){
WordDetailFragment frag=(WordDetailFragment)getFragmentManager()
.findFragmentById(R.id.word\u detail\u fragment);
如果(frag!=null){
框架设置id(id);
框架设置名称(名称);
框架设置类型(类型);
frag.setTranslate(translate);
框架设置示例(示例);
框架设置注释(注释);
}
}否则如果(第一次呼叫){
//无所事事
}否则{
意图i=新意图(getActivity().getApplicationContext(),
WordDetailActivity.class);
i、 putExtra(Word.ID,ID);
i、 putExtra(Word.NAME,NAME);
i、 putExtra(Word.TYPE,TYPE);
i、 putExtra(Word.TRANSLATE,TRANSLATE);
i、 putExtra(Word.EXAMPLE,EXAMPLE);
i、 putExtra(Word.NOTE,NOTE);
星触觉(i);
}
cursor.close();
}
}
public void onWordSaved(){
getLoaderManager().restartLoader(URL_LOADER,null,this);
}
@凌驾
公共加载器onCreateLoader(int-loaderID,Bundle){
String[]projection={Word.ID,Word.NAME,Word.TYPE,Word.TRANSLATE,
Word.EXAMPLE,Word.NOTE};
/*根据正在创建的加载程序的ID执行操作*/
开关(loaderID){
案例URL\u加载程序:
//返回一个新的游标装入器
cursorLoader=新的cursorLoader(getSherlockActivity(),//父
//活动
//上下文
WordListProvider.WORDS\u CONTENT\u URI,//要查询的表
projection,//要返回的projection
null,//无选择子句
null,//没有选择参数
null//默认排序顺序
);
返回游标装入器;
违约:
//传入了无效的id
返回null;
}
}
@凌驾
public void onLoadFinished(加载器,光标){
适配器.swapCursor(游标);
}
@凌驾
public void onLoaderReset(加载程序){
适配器.swapCursor(空);
}
}
尝试添加到片段类:
@Override
protected void onResume()
{
super.onResume();
getLoaderManager().restartLoader(URL_LOADER, null, this);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
@覆盖
受保护的void onResume()
{
super.onResume();
getLoaderManager().restartLoader(URL_LOADER,null,this);
}
公共void onLoaderReset(加载器){
适配器.swapCursor(空);
}
为了消除您对效率的担忧:当您调用初始init时,它将启动,但是相同ID上的restartLoader将自动取消先前的请求并启动一个新的请求。因此,它不会在活动启动时完全执行两次
更多信息请参见。尝试将以下内容添加到片段类:
@Override
protected void onResume()
{
super.onResume();
getLoaderManager().restartLoader(URL_LOADER, null, this);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
@覆盖
受保护的void onResume()
{
super.onResume();
getLoaderManager().restartLoader(URL_LOADER,null,this);
}
公共void onLoaderReset(加载器){
转接器(