tags:

views:

58

answers:

1

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

A: 

One way of dealing with this is to keep a Map around the same lifetime as your Adapter. The Map is simply a cache for getRingerTitle() calls. Be sure to flush the Map whenever you replace or requery() your Adapter.

Or, wrap your original Cursor in a CursorWrapper and override the appropriate methods to effectively "extend" your original Cursor by one column. You'd hold the aforementioned Map in your CursorWrapper implementation and return the cached value (or call getRingerTitle() 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 original Cursor came from a database query, consider using a join to avoid the extra database I/Os.

Also, don't override getView() on a SimpleCursorAdapter. Override newView() and bindView() instead.

CommonsWare
getRingerTitle() accepts a String Uri from the database that relates to a ringtone. the function queries the RingtoneManager for the title of the associated Uri
Ryan
also, i dont really know what "appropriate methods" need to be extended to attain these results- otherwise i might not be asking this...
Ryan
Well, it's been a while since I used CursorWrapper myself. getColumnCount() would need to be overridden to return the wrapped value plus one. getColumnIndex() would need to be overridden to handle whatever name you assign this column. getColumnName() would need to be overridden to return the column index you assign this column. getString() would need to be overridden to return your title. There might be others, but those four are certainly needed.
CommonsWare