Связывание данных курсора - PullRequest
2 голосов
/ 11 января 2010

Может быть, я поступаю неправильно, но если это так, пожалуйста, поправьте меня. Вот ситуация: у меня есть запрос, который возвращает строки URI для мелодий звонка, хранящихся в базе данных. Я расширил SimpleCursorAdapter, чтобы переопределить функцию getView (), чтобы запросить RingtoneManager для TITLE связанного URI звонка, однако функция getView () вызывается более одного раза в строке и несколько замедляет мое приложение. Есть ли способ запустить функцию один раз, чтобы отобразить uris на заголовки и сохранить эти данные где-нибудь, чтобы getView () мог быстро получить к ним доступ?

Фрагменты кода, связанного с кодом:

public String getRingerTitle(String uriString) {  
    Uri ringtoneUri = Uri.parse(uriString);   
    Ringtone r = RingtoneManager.getRingtone(this.context, ringtoneUri);  
    return r.getTitle(context);  
}  
public View getView(int position, View convertView, ViewGroup parent)  
    {  
           View v = convertView;  
           if (v == null) {  
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
                v = inflater.inflate(this.layout, null);  
          }  
           this.cursor.moveToPosition(position);
           String ringer = this.cursor.getString(this.cursor.getColumnIndex(PoolDbAdapter.KEY_RINGER));
            TextView rTitle = (TextView) v.findViewById(R.id.ringer_line_item);
            rTitle.setText(getRingerTitle(ringer));

           return(v);

    }  

Как можно оптимизировать функцию getRingerTitle () для кэширования данных или только для запроса каждого элемента один раз? ИЛИ - есть ли лучший способ, которым я должен подходить к этому?

Спасибо

1 Ответ

0 голосов
/ 11 января 2010

Один из способов справиться с этим - сохранить Map на том же уровне жизни, что и ваш Adapter. Map - это просто кэш для getRingerTitle() вызовов. Обязательно промывайте Map при каждой замене или requery() вашего адаптера.

Или оберните оригинал Cursor в CursorWrapper и переопределите соответствующие методы, чтобы эффективно "расширить" оригинал Cursor на один столбец. Вы бы держали вышеупомянутый Map в своей реализации CursorWrapper и возвращали кэшированное значение (или вызывали getRingerTitle() и кэшировали его) для дополнительного столбца. Это тот же базовый подход, что и в первом абзаце, но он обеспечивает более чистую абстракцию.

Вы не указываете, что именно делает getRingerTitle(). Если это другой запрос к базе данных, а исходный Cursor получен из запроса к базе данных, рассмотрите возможность использования объединения, чтобы избежать дополнительных операций ввода-вывода базы данных.

Кроме того, не переопределяйте getView() на SimpleCursorAdapter. Замените newView() и bindView() вместо.

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