Как использовать CursorLoader для отображения отдельных записей базы данных по одной - PullRequest
0 голосов
/ 03 января 2012

Я пытаюсь сделать ContentProvider с каждой записью, содержащей вопрос и соответствующий ответ.И Activity, показывающий TextViews каждого вопроса и ответа и кнопку «Next» под этими TextViews.При нажатии кнопки «Далее» я хотел бы показать следующий вопрос и ответ.

Я пытаюсь использовать CursorLoader и LoaderManager, потому что CursorLoaders хранят свои данные по onStop() и onStart(), и я пытаюсь узнать о CursorLoaders и LoaderManagers.

Все примеры, которые я нашел, используют setListAdapter(), но я не хочу, чтобы моя деятельность выглядела как список.Я пытался обойти это, используя SimpleCursorAdapter и используя bindView() для моего main.xml макета.Не уверен, что это сработает.

Если бы у меня был простой курсор, я бы использовал moveToNext(), но для LoaderManager кажется, что мне нужно restartLoader() с новым запросом.Я думаю, что создание нового запроса будет стоить больше времени, чем просто переход к следующей записи с курсором.Тем более, что мне нужно знать положение текущей или следующей записи.

Поэтому мой вопрос: могу ли я использовать CursorLoader и LoaderManager для просмотра базы данных, запись за записью без необходимостисделать новый запрос для следующей записи?Или CursorLoaders и LoaderManagers действительно только для ListViews?

Вот мой код, я понимаю, что он немного, но я прочитал и перечитал страницы Android в Loaders and LoadManager.

 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) {
        }               
    });
}

1 Ответ

0 голосов
/ 04 августа 2012

Я понимаю, что мой вопрос был неопределенным, я был действительно потерян.Вот мой ответ, спустя много месяцев, надеюсь, что он поможет кому-то, кто находится в моем прошлом положении.

onCreateLoader () автоматически вызывается, когда я вызываю getLoaderManager (). InitLoader () или когда произошли изменения в поставщике содержимого (поставщик содержимого должен вызвать getContentResolver (). NotifyChange (), чтобы это работало).Я предоставляю код для загрузки курсора при перезаписи метода LoaderManager.LoaderCallbacks.onCreateLoader ().Загрузчик курсора автоматически передается onLoadFinished ().Вот и все, я больше не трогаю загрузчик курсора.onLoadFinished (), который вызывается автоматически, получает курсор (сделанный из загрузчика курсора) в качестве аргумента.Я обновляю адаптер в своем переопределении onLoadFinished (), используя аргумент курсора this.adapter.setCursor (курсор).

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

Поскольку адаптер установлен в onLoadFinished () с использованием метода adapter.setCursor (Cursor) и очищен в onLoaderReset () с помощью метода adapter.setCursorToNull ().Тогда адаптер должен иметь эти методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...