我有一个包含数据库中所有行的光标。我将光标传递给 CursorAdapter,并在列表中显示数据。但我需要在一开始就展示一个额外的元素。我怎样才能做到这一点?
我在某处读到,也许它可以用 CursorWrapper 完成,它可以在结果中注入额外的值。但我不太确定该怎么做。
如果有人可以给我看一个例子(代码),或者有另一个想法如何解决这个问题,请告诉我。谢谢!
我有一个包含数据库中所有行的光标。我将光标传递给 CursorAdapter,并在列表中显示数据。但我需要在一开始就展示一个额外的元素。我怎样才能做到这一点?
我在某处读到,也许它可以用 CursorWrapper 完成,它可以在结果中注入额外的值。但我不太确定该怎么做。
如果有人可以给我看一个例子(代码),或者有另一个想法如何解决这个问题,请告诉我。谢谢!
正如我在这个问题中所建议的那样,如何使用MergeCursor
和的组合:如何将额外的元素插入到 SimpleCursorAdapter 或 Cursor for a Spinner?MatrixCursor
像这样覆盖 getCount:
@Override
public int getCount() {
final int count = super.getCount();
return count+1;
}
并且曾经使用过适配器的人会获得额外的一行。只要记住在 getView 中处理这个,即。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position == 0) {
final View v = inflater.inflate(R.layout.special_suggestion, parent,false);
final TextView tv = (TextView) v.findViewById(android.R.id.text1);
tv.setText("Search for '" + this.keyword + "'");
return v;
}
else {
try {
return super.getView(position, convertView, parent);
}
catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException: " + e);
}
}
return inflater.inflate(this.layout, parent,false);
}
您可以使用列表视图的addHeaderView()或addFooterView():
TextView label = new TextView(context);
label.setText("Something Here");
listView.addHeaderView(label);
请务必在致电之前这样做setAdapter()
。
Cursor
您可以从into读取数据List<YourRow>
,其中YourRow
是光标行中数据的类。然后只需将新YourRow
项目添加到列表并BaseAdapter
用于您的ListView
. 阅读本文以了解如何处理BaseAdapter
。
我最终通过在数据库中添加一个额外的元素来解决这个问题。这是最简单的解决方案,因为我一开始就需要额外的元素。因此,在创建我的数据库之后,我在表中插入了一行我需要额外元素的行,其中包含我想要的值。
我还发现了这个讨论 [ https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI ] 所以如果有人有类似的问题,这将是一个起点。谢谢!
在适配器中,您可能可以在getView
方法中显示额外的数据。但这有点取决于数据来自哪里,你想用它做什么(只是显示它?)等等。
与向数据库添加额外字段类似,您可以向数据库中的投影添加额外字段。这为您节省了一点数据库空间并减少了信息冗余。这确实意味着每次访问都会重新计算该字段,而不仅仅是存储。
这是我用来根据商品价格(以美分存储)和相关单位来格式化成本的投影示例。
public static final String CONCATE_COST
= "'$' || CASE WHEN SUBSTR(ROUND("+COLUMN_PRICE
+"/100.0, 2), LENGTH(ROUND("+COLUMN_PRICE
+"/100.0, 2))-1, 1)='.' THEN ROUND("+COLUMN_PRICE
+"/100.0, 2) || '0' else ROUND("+COLUMN_PRICE
+"/100.0, 2) end || "+COLUMN_UNIT;
将其用作传递给列表视图的列,您可以直接将其与视图中的字段配对。
在这些情况下,我的解决方案是使用静态值执行 UNION 查询。前任:
(选择 -1 作为 id,“HERE GOES THE NAME”作为名称,“HERE GOES THE ADDRESS”作为地址) UNION(从联系人中按姓名顺序选择 ID、姓名、地址)
(请仔细检查语法,我是凭记忆做的)
这样,您将获得带有 -1|HERE GOES THE NAME|HERE GOES THE ADDRESS 以及其余行的第一行
因此,您不会“污染”数据库,并且很容易根据条件打开/关闭第一行并使用连接。