如何有效地显示来自HashMap的值以用于SQLite的记录?

胡椒

目标:应用程序应允许用户为显示的项目添加数量。考虑从所有可能产品的列表中创建产品顺序。产品的代码列表可能会很长(例如成千上万的商品,甚至更多)。另一方面,为该订单选择的商品数量很少(最多几个或几十个)。

已经实现:到目前为止,我已经实现了OrderOverviewActivity使用LoaderManager和内容提供者从数据库访问信息的方法。我确实使用MyCursorAdapter它来扩展CursorAdapter和覆盖其newView()andbindView()方法。

newView()还创建了一个ViewHolder与以子视图,并与从光标位置提取的值的缓冲区引用实例-这样的:

private static class ViewHolder {
    public TextView code;
    public CharArrayBuffer codeBuffer = new CharArrayBuffer(20);

    public TextView name;
    public CharArrayBuffer nameBuffer = new CharArrayBuffer(100);

    public TextView quantity;
    public CharArrayBuffer quantityBuffer = new CharArrayBuffer(10);
}

newView()看起来像这样:

    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        View v = mInflater.inflate(mLayout, parent, false);

        ViewHolder holder = new ViewHolder();

        holder.code = (TextView) v.findViewById(R.id.code);
        holder.name = (TextView) v.findViewById(R.id.name);
        holder.quantity = (TextView) v.findViewById(R.id.quantity);

        v.setTag(holder);

        return v;
    }

bindView()使用支架的缓冲区,以避免许多的创作String对象:

    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder holder = (ViewHolder) view.getTag();

        cursor.copyStringToBuffer(1, holder.codeBuffer);  // ProductTable.COLUMN_CODE
        cursor.copyStringToBuffer(2, holder.nameBuffer);  // ProductTable.COLUMN_NAME

        holder.code.setText(holder.codeBuffer.data, 0, holder.codeBuffer.sizeCopied);
        holder.name.setText(holder.nameBuffer.data, 0, holder.nameBuffer.sizeCopied);

        // The quantity (v for value) from the HashMap<String, String>.
        String v = mQuantity.get(String.valueOf(holder.codeBuffer.data, 0,
                                 holder.codeBuffer.sizeCopied));
        if (v != null) {
            holder.quantity.setText(v);
            holder.quantity.setBackgroundColor(Color.DKGRAY);
        }
        else {
            holder.quantity.setText(null);
            holder.quantity.setBackgroundColor(Color.TRANSPARENT);
        }
    }

问题的核心:请注意,数量是通过从HashMap<String, String>对象中提取的String.valueOf(data, 0, data.size)恐怕它会创建一个字符串对象,以后必须对其进行垃圾回收,从而破坏性能。有没有更好的办法从地图上设置数量TextView值?

用户

对于,我不会同意yanchenko的意见CharArrayBuffer,这在Cursor基于基础的适配器中使用是一个不错的改进(尤其是当要使用Cursor许多String列时)。要摆脱这些多余String的东西,第一个选择是将其设置为mQuantity HashMap无效的键(以及它是类,final因此您根本无法使其工作)。

识别行的另一种方法是仍然_id需要ListView

与此相关的您可以:

  • 有两个HashMaps都具有一个键Long(_id)作为键,一个将保存COLUMN_CODE,另一个将保存实际数量(或一个_id在代码和代码之间的映射映射,另一个是您的当前映射)。这两个映射将被同步(如果您删除了一个长ID的值,那么也会将其从另一个值中删除,添加值时也是如此)。在该getView()方法中,您将通过使用_id获得名称Cursor,但是这将需要自动装箱操作(longLong)。

    class DataWrapper {
     private HashMap<Long, String> mCodeMapping = new HashMap<Long, String>();
     private HashMap<Long, String> mQuantityMapping = new HashMap<String, String>();
    
     public String getCode(long id) {
          return mCodeMapping.get(id);
     }
    
     public String getQuantity(long id) {
          return mQuantityMapping.get(getCode());
     }
    
     public String getQuantity(String code) {
          return mQuantityMapping.get(code);
     }
    
     public void put(long id, String code, String quantity) {
         mCodeMapping.put(id, code);
         mQuantityMapping .put(code, quantity); 
     } 
    }  
    
  • 尽管_id是,long并且您有相当数量的值,但您可能会威胁它int(因为您将处于最大值的边界内int)。这样做将使您可以简单地将aSparseArray与自定义类一起使用(在long之间进行转换int):

    class WrapperData {
     String code; //or use the CharArraybuffer?
     String quantity;
    }
    
    SparseArray<WrapperData> data = new SparseArray<WrapperData>();
    // in the getView() method 
    WrapperData wd = data.get((int) _id_value); // further use wd.code or wd.quantity
    
  • 最后一个选择是实现自己的类SparseArray,这将使您能够在简单的long键(因此没有自动装箱)到代码和数量值之间建立映射

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何有效地从记录子集中获取 has_many 值?

来自分类Dev

如何根据条件有效地将函数应用于数组中的值?

来自分类Dev

如何有效地显示熊猫的日期范围?

来自分类Dev

如何有效地显示用户更改/更新

来自分类Dev

如何有效地更新表的列值?

来自分类Dev

如何有效地语法

来自分类Dev

在vue.js中绑定时如何有效地显示文本而不是空值?

来自分类Dev

有效地找到记录的子集以及总数

来自分类Dev

哪种技术更有效地替换记录

来自分类Dev

CosmosDB:有效地从大型容器迁移记录

来自分类Dev

有效地更新MySQL记录

来自分类Dev

您如何有效地使用“脚本”命令来记录交互式外壳?

来自分类Dev

如何有效地将记录存储为Ember查询参数

来自分类Dev

您如何有效地使用“脚本”命令来记录交互式外壳?

来自分类Dev

如何有效地从记录列表中选择特定的行号?

来自分类Dev

如何有效地存储聊天记录 [NodeJS, SQL]

来自分类Dev

如何有效地对从数据库读取的记录进行复杂的处理

来自分类Dev

J:如何有效地将动词应用于后缀的前缀?

来自分类Dev

如何有效地将条件应用于numpy数组的索引?

来自分类Dev

如何有效地将函数逐行应用于NumPy矩阵

来自分类Dev

如何有效地将更改功能用于输入类型

来自分类Dev

如何最有效地从大型 SQLite 数据库中提取数据?

来自分类Dev

PHP - 有效地显示内联 SVG 图像

来自分类Dev

如何有效地获取具有唯一值的索引列表?

来自分类Dev

如何使用Spark有效地检查列中的所有值?

来自分类Dev

SAS如何有效地创建具有相应值的变量

来自分类Dev

SQL有效地选择值,该值在另一个表中有记录

来自分类Dev

有效地删除NA值

来自分类Dev

在行的子集上有效地设置值

Related 相关文章

  1. 1

    如何有效地从记录子集中获取 has_many 值?

  2. 2

    如何根据条件有效地将函数应用于数组中的值?

  3. 3

    如何有效地显示熊猫的日期范围?

  4. 4

    如何有效地显示用户更改/更新

  5. 5

    如何有效地更新表的列值?

  6. 6

    如何有效地语法

  7. 7

    在vue.js中绑定时如何有效地显示文本而不是空值?

  8. 8

    有效地找到记录的子集以及总数

  9. 9

    哪种技术更有效地替换记录

  10. 10

    CosmosDB:有效地从大型容器迁移记录

  11. 11

    有效地更新MySQL记录

  12. 12

    您如何有效地使用“脚本”命令来记录交互式外壳?

  13. 13

    如何有效地将记录存储为Ember查询参数

  14. 14

    您如何有效地使用“脚本”命令来记录交互式外壳?

  15. 15

    如何有效地从记录列表中选择特定的行号?

  16. 16

    如何有效地存储聊天记录 [NodeJS, SQL]

  17. 17

    如何有效地对从数据库读取的记录进行复杂的处理

  18. 18

    J:如何有效地将动词应用于后缀的前缀?

  19. 19

    如何有效地将条件应用于numpy数组的索引?

  20. 20

    如何有效地将函数逐行应用于NumPy矩阵

  21. 21

    如何有效地将更改功能用于输入类型

  22. 22

    如何最有效地从大型 SQLite 数据库中提取数据?

  23. 23

    PHP - 有效地显示内联 SVG 图像

  24. 24

    如何有效地获取具有唯一值的索引列表?

  25. 25

    如何使用Spark有效地检查列中的所有值?

  26. 26

    SAS如何有效地创建具有相应值的变量

  27. 27

    SQL有效地选择值,该值在另一个表中有记录

  28. 28

    有效地删除NA值

  29. 29

    在行的子集上有效地设置值

热门标签

归档