Android: измените данные из Content Provider перед использованием в ListView - PullRequest
2 голосов
/ 04 марта 2011

Я запрашиваю таблицу ContactsContract.Data в Android, используя ListView для отображения данных.

Есть ли способ изменить данные, возвращаемые поставщиком контента, до их отображения?

Вот конкретный пример:

Я могу запросить ContactsContract.Data для столбца STARRED , который будет возвращать «0» или «1», но как насчет случая, когда я хотел бы вместо этого преобразовать От «0» до «не помечено» и «1» до «помечено»

Вот мой существующий код:

 private void populateList() {
// Start with the cursor
    Cursor cursor = getContacts();
    // Then the adapter
    String[] fields = new String [] {
            ContactsContract.Data.DISPLAY_NAME,
            ContactsContract.Data.CONTACT_STATUS,
                    // WOULD LIKE THIS FIELD TO BE MODIFIED
            ContactsContract.Data.STARRED
    };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.aa_list_activity_row_sjp,
            //android.R.layout.simple_list_item_multiple_choice,
            cursor,
            fields,
            new int [] {
                R.id.rowText1,
                R.id.rowText2,
                R.id.rowText3
                });
    // end with "setListAdapter"
    setListAdapter(adapter);
}

private Cursor getContacts() {
    // Setup the query and return a cursor
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String [] projection = new String [] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.Contacts.CONTACT_STATUS,
        ContactsContract.Contacts.STARRED
    };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
    String [] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}

Я не уверен, возможно ли это, но вместо того, чтобы вставлять значение столбца STARRED непосредственно в мое представление, я хотел бы сначала выполнить некоторое условное редактирование значения столбца.

Есть предложения?

Большое спасибо, Стив

Ответы [ 2 ]

1 голос
/ 04 марта 2011

djg вдохновил меня, и после еще одного исследования я обнаружил, что это решение ссылается на в другой теме :

Вы можете установить пользовательский SimpleCursorAdapter.ViewBinder:

Мне нравится это решение, потому что вам не нужно создавать другой класс, если вы используете анонимную реализацию.

В моем конкретном случае я бы вставил следующий блок кода после создания экземпляра моего SimpleCursorAdapter и непосредственно перед вызовом setListAdapter(adapter);

Новый код:

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
  @Override
  public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
    if (columnIndex == 3) {
      ((TextView) view).setText(cursor.getString(columnIndex).equals("1") ? "starred" : "not starred");
      return true;
    }
    return false;
  }
});
1 голос
/ 04 марта 2011

Вы можете попробовать создать подкласс SimpleCursorAdapter и реализовать метод

public void setViewText(TextView v, String text) {
    if (v.getId() == R.id.rowText3) {
        text = "0".equals(text) ? "not starred" : "starred";
    }
    v.setText(text);
}
...