开发者社区> 问答> 正文

关联光标数据

也许我会采用错误的方式,但是如果是这样,请纠正我。这是一种情况:我有一个查询,该查询返回存储在数据库中的铃声的URI字符串。我已经扩展了SimpleCursorAdapter来覆盖getView()函数,以在RingtoneManager中查询关联的铃声URI的标题,但是每行多次调用getView()函数,这会使我的应用程序运行速度大大降低。有没有一种方法可以一次运行该函数以将uri映射到标题并将该数据存储在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()函数以缓存数据或仅查询每个项目一次?或者-有更好的方法来应对这个问题吗?

谢谢

展开
收起
Puppet 2020-01-24 14:16:06 454 0
1 条回答
写回答
取消 提交回答
  • 解决这个问题的一种方法是保持Map与您的寿命相同Adapter。该Map仅仅是一个缓存getRingerTitle()调用。确保Map每次更换或requery()适配器时都冲洗。

    或者,将原件包裹Cursor在中CursorWrapper并覆盖适当的方法,以有效地将原件“扩展” Cursor一列。您将Map在CursorWrapper实现中保留上述内容,并getRingerTitle()为多余的列返回缓存的值(或调用并缓存它)。这与第一段中的基本方法相同,但是提供了更简洁的抽象。

    您没有指明getRingerTitle()确切的用途。如果这是另一个数据库查询,而您的原始Cursor查询来自数据库查询,请考虑使用联接以避免额外的数据库I / O。

    另外,请勿getView()在上覆盖SimpleCursorAdapter。覆盖newView()和bindView()代替。

    2020-01-24 14:16:21
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载