Android 按下后退按钮时,光标加载程序应重新启动

Android 按下后退按钮时,光标加载程序应重新启动,android,android-cursorloader,Android,Android Cursorloader,我有一个listFragment,当单击列表中的一项时,它会启动一个新的活动。当按下后退按钮时,列表再次显示。我正在使用光标加载器,所以,我想知道当按下后退按钮时,是否有一种简单的方法来刷新光标加载器。这是因为新活动会更改列表的内容 编辑: public class ListWordFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private

我有一个listFragment,当单击列表中的一项时,它会启动一个新的活动。当按下后退按钮时,列表再次显示。我正在使用光标加载器,所以,我想知道当按下后退按钮时,是否有一种简单的方法来刷新光标加载器。这是因为新活动会更改列表的内容

编辑:

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(加载器){
转接器(