目标:应用程序应该允许用户为显示的项目添加数量。考虑从所有可能的产品列表中创建产品顺序。产品的代码列表可能很长(如数万甚至更多)。另一方面,订单选择的商品数量非常少(最多几个或几十个)。
已经实现:到目前为止,我已经实现了OrderOverviewActivity
使用LoaderManager
和内容提供者来访问数据库中的信息。我确实使用MyCursorAdapter
它扩展CursorAdapter
并覆盖了它的newView()
和bindView()
方法。
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 值?