Maybe I’m going about this the wrong way, but if so, please correct me. Here is the situation: I have a query which returns URI strings for ringtones stored in a database. I have extended the SimpleCursorAdapter to override the getView() function to query the RingtoneManager for the TITLE of the associated ringer URI, however the getView() function is called more than once per row and slows my application down quite a bit. Is there a way I can run the function once to map uris to titles and store that data somewhere that the getView() can access the data quickly?
Related code snippets:
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);
}
How can the getRingerTitle() function be optimized to cache the data or to only query for each item once?
OR – is there a better way I should be approaching this?
Thanks
One way of dealing with this is to keep a
Maparound the same lifetime as yourAdapter. TheMapis simply a cache forgetRingerTitle()calls. Be sure to flush theMapwhenever you replace orrequery()your Adapter.Or, wrap your original
Cursorin aCursorWrapperand override the appropriate methods to effectively “extend” your originalCursorby one column. You’d hold the aforementionedMapin yourCursorWrapperimplementation and return the cached value (or callgetRingerTitle()and cache it) for the extra column. This is the same basic approach as the one in the first paragraph, but provides a somewhat cleaner abstraction.You don’t indicate what
getRingerTitle()exactly does. If it is another database query, and your originalCursorcame from a database query, consider using a join to avoid the extra database I/Os.Also, don’t override
getView()on aSimpleCursorAdapter. OverridenewView()andbindView()instead.