关联游标数据

时间:2010-01-10 22:31:25

标签: android

也许我会以错误的方式解决这个问题,但如果是这样,请指正。情况如下:我有一个查询,它返回存储在数据库中的铃声的URI字符串。我已经扩展了SimpleCursorAdapter以覆盖getView()函数来查询RingtoneManager以获取相关振铃器URI的TITLE,但是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 :(得分:0)

解决此问题的一种方法是将MapAdapter保持相同的生命周期。 Map只是getRingerTitle()次调用的缓存。无论何时更换或Map适配器,请务必刷新requery()

或者,将原始Cursor包裹在CursorWrapper中并覆盖相应的方法,以便将原始Cursor有效地“扩展”一列。您在Map实现中保留上述CursorWrapper并返回缓存值(或调用getRingerTitle()并缓存它)以获取额外列。这与第一段中的基本方法相同,但提供了一些更清晰的抽象。

您没有说明getRingerTitle()到底做了什么。如果它是另一个数据库查询,并且您的原始Cursor来自数据库查询,请考虑使用连接来避免额外的数据库I / O.

此外,请勿覆盖getView()上的SimpleCursorAdapter。改为覆盖newView()bindView()

相关问题