Android - SimpleCursorAdapter для просмотра - PullRequest
0 голосов
/ 03 ноября 2011

возможно ли создать представление, управляемое SimpleCursorAdapter .Содержимое этого представления всегда является записью из БД.

Вид (dataView) выглядит следующим образом:

txtData1
txtData2
txtData3
btnPrev btnNext

Я прочитал и попытался настроить это поведение.Надеюсь, что это имеет смысл:

public class mActivity extends Activity {
  public Context me = this; 
  public SimpleCursorAdapter mAdapter = null;
  public Cursor mCursor = null;

  private OnClickListener btnStart_onClick = new OnClickListener() {
    public void onClick(View v) {
      setContentView(R.layout.dataView);

      mCursor = mDB.rawQuery("SELECT * FROM Data", null);
      startManagingCursor(mCursor);

      mAdapter = new SimpleCursorAdapter(
        me,
        R.layout.dataView,
        mCursor,
        new String[] {"Data1", "Data2", "Data3"},
        new int[] {R.id.txtData1 , R.id.txtData2, R.id.txtData3});

        mAdapter.setViewBinder(VIEW_BINDER);
        mCursor.moveToFirst();
    }
  };
  static final ViewBinder VIEW_BINDER = new ViewBinder() {
    public boolean setViewValue(View view, Cursor cursor, int columnIndex)
    {
      switch (view.getId())
      {
        case R.id.txtData1:
          TextView txt = (TextView) view;
          if (txt != null)
          {
            int index = cursor.getColumnIndex("Data1");
            txt.setText(cursor.getString(index));
          }
          return true;

        case R.id.txtData2:
          TextView txt = (TextView) view;
          if (txt != null)
          {
            int index = cursor.getColumnIndex("Data2");
            txt.setText(cursor.getString(index));
          }
          return true;

        case R.id.txtData3:
          TextView txt = (TextView) view;
          if (txt != null)
          {
            int index = cursor.getColumnIndex("Data3");
            txt.setText(cursor.getString(index));
          }
          return true;

        default:
          return false;
      }
    }
  };
}

Когда я запускаю с btnStart_onClick, я не получаю Данные в своих текстовых полях: - (

Может кто-нибудь помочь? Может ли это работать так?

Следующий вопрос: как я могу использовать кнопки «Предыдущий» или «Следующий»? Возможно, это единственное, что мне не хватает, чтобы «загрузить» первые данные ...

РЕДАКТИРОВАТЬ: я расширил свой пример с глобальным mCursor ивызов mCursor.moveToFirst () В моем приложении я также протестировал кнопки next / prev и функции mCursor.moveToNext () и mCursor.moveToPrevious ()

Но это не изменится: - (

1 Ответ

0 голосов
/ 03 ноября 2011

Насколько я могу судить, я думаю, что есть много концептуальных / организационных / синтаксических проблем с вашим кодом. Прежде всего, адаптер обычно используется представлением, таким как ListView или Spinner, которое заполняется данными, полученными адаптером через курсор (или любой структурой данных, поддерживающей его). Тем не менее, я не вижу этот шаблон в вашем коде, и мне интересно, как использовать адаптер в вашем случае.

Во-вторых, вы выполняете целый запрос SELECT * в своем прослушивателе кликов, т. Е. Вы получаете все свои 1000 записей за каждый клик на ... ну, на чем, точно? Вы определяете прослушиватель щелчков, но никогда не устанавливаете его на что-либо - так же, как вы определяете адаптер, но не привязываете его ни к чему. Код, который устанавливает адаптер с запросом к базе данных и связывателем, действительно должен быть размещен вне слушателя.

В заключение, я полагаю, что вы немного посмеялись над именами переменных перед публикацией кода, потому что в следующем фрагменте:

TextView txt = (TextView) view;
if (txt != null)
{
    int index = cursor.getColumnIndex("Data1");
    String txt = cursor.getString(index);
    txt.setText(txt);
}

Я едва мог понять, как компилятор предназначен для различения двух txt переменных в последней строке тела if.

...