2014-04-05 98 views
0

我想在我的應用程序片段中有兩個光標加載器。它們中的每一個都有不同的數據集並用於不同的列表中。設置多個光標加載器與多個適配器 - Android

我發現某處用光標可以使用getId()方法,然後用switch做點什麼。但是,總有方法:getLoaderManager().initLoader(0,null,this);後,它可以是這樣的:

adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, null, from, to, 0);

此方法僅適用於一個光標,但如果我有adapter1adapter2?我如何確定哪個光標適用於哪個適配器?

回答

1

我的解決方案是實現回調監聽

public class Query extends FragmentActivity {//do not implement callbacks 
getSupportLoaderManager().initLoader(Constants.LOADER_DAILY_TASK, 
null,dailyTaskResultLoaderListener);//note listener not "this" 
getSupportLoaderManager().initLoader(Constants.LOADER_OTHER_TASK, 
null,otherTaskResultLoaderListener);//note listener not "this" 

private LoaderCallbacks<Cursor> dailyTaskResultLoaderListener 
= new LoaderCallbacks<Cursor>() { 
@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle bun) {  
     return new CursorLoader(getBaseContext(), 
Constants.DAILY_TASK_URI,projection, selection,selArgs,null); } 
@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
{...} 
public void onLoaderReset(Loader<Cursor> cursor) {...}}; 
private LoaderCallbacks<Cursor> otherTaskResultLoaderListener 
= new LoaderCallbacks<Cursor>() {  

....我覺得你的想法

0

一個可能的解決方案是這樣的。從Fragment聲明中刪除LoaderCallbacks接口,然後爲LoaderCallbacks創建兩個單獨的實現,每個適用於您要設置的每個適配器。最後在每個實現的onLoadFinished方法中設置適配器。

public class ExampleFragmen extends Fragment { // Don't implement LoaderCallbacks here. 

    private static final int LOADER_A = 0; 
    private static final int LOADER_B = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     getLoaderManager().restartLoader(LOADER_A, null, new LoaderACallbacks()); 
     getLoaderManager().restartLoader(LOADER_B, null, new LoaderBCallbacks()); 
     ... 
    } 

    public class LoaderACallbacks implements LoaderCallbacks<Cursor> { 

     @Override 
     public Loader<Cursor> onCreateLoader(int loader, Bundle args) { 
     } 

     @Override 
     public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
      // Set up adapter A here... 
     } 

     @Override 
     public void onLoaderReset(Loader<Cursor> loader) { 
     } 

    } 

    public class LoaderBCallbacks implements LoaderCallbacks<Cursor> { 

     @Override 
     public Loader<Cursor> onCreateLoader(int loader, Bundle args) { 
     } 

     @Override 
     public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
      // Set up adapter B here... 
     } 

     @Override 
     public void onLoaderReset(Loader<Cursor> loader) { 
     } 

    } 

} 
1

不需要單獨的加載器回調。答案在於傳遞到裝載機經理ID:

private static final int LOADER_A_ID = 1; 
private static final int LOADER_B_ID = 2; 

public void onCreate(Bundle savedInstanceState) { 
    ... 

    getLoaderManager().initLoader(LOADER_A_ID, null, this); 
    getLoaderManager().initLoader(LOADER_B_ID, null, this); 
} 

public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) { 
    switch (loaderId) { 
     case LOADER_A_ID: 
      // return loader for cursor A/ adapter A 

     case LOADER_B_ID: 
      // return loader for cursor B/ adapter B 
    } 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    switch (loader.getId()) { 
     case LOADER_A_ID: 
      adapterA.swapCursor(cursor); 
      break; 

     case LOADER_B_ID: 
      adapterB.swapCursor(cursor); 
      break; 

    } 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    ... 
} 

,你這樣想,只執行一次回調方法可以使盡可能多的光標裝載機。

+0

不能初始化一個以上的裝載機。 此外,您正在創建不必要的adaper(可以使用相同的適配器) –

+1

您可以根據需要創建儘可能多的裝入器,達到int的限制。這就是加載器ID的全部要點。 – tbm