我有一个包含数据库中所有行的Cursor。我将Cursor传递给CursorAdapter,并在列表中显示数据。但我需要在开头展示一个额外的元素。我怎么能这样做?
我在某处读到可能可以使用CursorWrapper完成,它可以在结果中注入额外的值。但我不太清楚该怎么做。
如果有人可以告诉我一个例子(代码),或者想知道如何解决这个问题,请告诉我。 THX!
答案 0 :(得分:10)
如我在此问题中所建议的那样使用MergeCursor
和MatrixCursor
的组合怎么样:How to insert extra elements into a SimpleCursorAdapter or Cursor for a Spinner?
答案 1 :(得分:4)
像这样覆盖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);
}
答案 2 :(得分:2)
您可以使用列表视图的addHeaderView()或addFooterView():
TextView label = new TextView(context);
label.setText("Something Here");
listView.addHeaderView(label);
请务必在致电setAdapter()
之前这样做。
答案 3 :(得分:1)
您可以将Cursor
中的数据读取到List<YourRow>
,其中YourRow
是光标行中数据的类。然后,只需将新YourRow
项添加到列表中,然后对BaseAdapter
使用ListView
。阅读this,了解如何处理BaseAdapter
。
答案 4 :(得分:1)
我最终通过在数据库中添加一个额外的元素来解决这个问题。这是最简单的解决方案,因为我在开始时需要额外的元素。所以在创建我的数据库之后,我在表中插入了一行,我需要额外的元素,以及我想要的值。
我也发现了这个讨论[https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI],所以如果有人有类似的问题,那将是一个起点。 THX!
答案 5 :(得分:0)
在适配器中,您可以在getView
方法中显示额外数据。但它有点取决于数据的来源,你想用它做什么(只是显示它?)等。
答案 6 :(得分:0)
与向数据库添加额外字段类似,您可以从数据库向投影添加其他字段。这样可以节省数据库中的一些空间并减少信息冗余。这意味着每次访问都会重新计算字段,而不是仅存储。
以下是我用于根据商品价格(以美分存储)和相关单位格式化成本的投影示例。
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;
将其用作列传递到列表视图,然后直接将其与视图中的字段配对。
答案 7 :(得分:0)
在这些情况下,我的解决方案是使用静态值执行UNION查询。 EX:
(选择-1作为id,“HERE GOES THE NAME”作为名称,“HERE GOES THE ADDRESS”作为地址) 联盟 (从姓名中选择联系人ID,姓名,地址)
(请仔细检查语法,我是通过记忆做的)
这样,你得到第一行-1 |这里是名字|这里去地址加上剩下的行
所以,你不是在“污染”数据库,而且很容易用条件打开/关闭第一行并使用连接。