0

ContentProvider質問と対応する回答を含む各レコードでを作成しようとしています。そして、各質問と回答のTextViewを表示するアクティビティと、それらのTextViewの下にある[次へ]ボタン。[次へ]ボタンをクリックすると、次の質問と回答が表示されます。

onStop()CursorLoaderはデータをとに保持するため、CursorLoaderとLoaderManagerを使用しようとしています。またonStart()、とについて学習しようとしていCursorLoadersますLoaderManagers

私が見つけた例はすべて使用setListAdapter()していますが、私のアクティビティをリストのように見せたくありません。SimpleCursorAdapterを使用bindView()してmain.xmlレイアウトを使用することで、これを回避しようとしました。それがうまくいくかどうかはわかりません。

プレーンカーソルがある場合はを使用しますmoveToNext()が、その場合は新しいクエリを使用する必要があるLoaderManagerようです。restartLoader()新しいクエリを作成するには、カーソルを使って次のレコードに移動するよりも時間がかかると思います。特に、現在または次のレコードの位置を知る必要があるためです。

だから私の質問は:次のレコードのために新しいクエリを作成することなく、CursorLoaderとを使用LoaderManagerしてデータベースを調べ、レコードごとに記録することはできますか?それともCursorLoadersLoaderManagers本当にListViews専用ですか?

これまでの私のコードは次のとおりです。それほど多くはないことに気付きましたが、ローダーとロードマネージャーでAndroidのページを読んだり読み直したりしました。

 public class Main extends Activity implements LoaderManager.LoaderCallbacks<Cursor>{

SimpleCursorAdapter adapter;
String curFilter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    this.adapter = new SimpleCursorAdapter(getApplicationContext(),
                                           R.layout.main,
                                           null,
                                           new String[]{},
                                           new int[]{R.id.questionText,R.id.answerText},
                                           0);
    LinearLayout mainLayout = (LinearLayout)findViewById(R.id.mainLayout);

    this.adapter.bindView(mainLayout, getApplicationContext(), null);

    this.getLoaderManager().initLoader(0,null, this);

    Button nextQuestionButton = (Button)this.findViewById(R.id.Nextbutton);

    nextQuestionButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {
        }               
    });
}
4

1 に答える 1

0

私の質問が漠然としていたことを理解しています、私は本当に迷子になりました。これが私の答えです。何ヶ月も経って、それが私の過去の立場にいる誰かに役立つことを願っています。

onCreateLoader()は、getLoaderManager()。initLoader()を呼び出すとき、またはコンテンツプロバイダーに変更があったときに自動的に呼び出されます(これを機能させるには、コンテンツプロバイダーはgetContentResolver()。notifyChange()を呼び出す必要があります)。メソッドLoaderManager.LoaderCallbacks.onCreateLoader()を上書きするときにカーソルローダーを作成するコードを提供します。カーソルローダーは自動的にonLoadFinished()に渡されます。それだけです。カーソルローダーには二度と触れません。自動的に呼び出されるonLoadFinished()は、(カーソルローダーから作成された)カーソルを引数として受け取ります。カーソル引数this.adapter.setCursor(cursor)を使用して、onLoadFinished()のオーバーライドでアダプターを更新します。

SimpleCursorAdapterにはmoveToNextまたはmoveToPreviousがないため、SteppedAdapterを作成しました。以下を参照してください。

public class SteppedAdapter {
    private Cursor cursor = null;
    // This class uses a reference which may be changed
    // by the calling class.
    public SteppedAdapter (Cursor cursor) {
    this.cursor = cursor;
    }

    private int getColumnIndexOrThrow (String columnName) {
    return cursor.getColumnIndexOrThrow(columnName);
    }   

    public void moveToNext () {     
    if (null != cursor && !cursor.isClosed()) {
        if (cursor.isLast()) {
            cursor.moveToFirst();
        }
        else {
            cursor.moveToNext();
        }
    }   
    }

    public void moveToPrevious () {
    if (null != cursor && !cursor.isClosed()) {
        if (cursor.isFirst()) {
            cursor.moveToLast();
        }
        else {
            cursor.moveToPrevious();
        }
    }
    }

    public String getCurrentTarget (String targetColumn) throws EmptyCursorException {
    int idx = cursor.getColumnIndex(targetColumn);  
    String value = null;
    try {
        value = cursor.getString(idx);  
    }
    catch (CursorIndexOutOfBoundsException e){
        if ( 0 == cursor.getCount()) {
            throw new EmptyCursorException("Cursor is empty: "+e.getMessage()); 
        }
        else {
            throw e;
        }
    }
    return value;
    }   

    public void setCursor (Cursor cursor) {
    this.cursor = cursor;
    }

    public void setCursorToNull () {
    this.cursor = null; 
    }

    public int getPosition () {
    return this.cursor.getPosition();
    }

    public boolean cursorIsClosed () {
    return this.cursor.isClosed();
    }   

    public int getCount () {
    return cursor.getCount();
    }
} // end

アダプタはメソッドadapter.setCursor(Cursor)を使用してonLoadFinished()で設定され、メソッドadapter.setCursorToNull()を使用してonLoaderReset()でクリアされるためです。次に、アダプタにはこれらのメソッドが必要です。

于 2012-08-03T21:21:35.087 に答える