添加额外的元素到游标适配器android

我有一个Cursor包含我的数据库中的所有行。 我将Cursor传递给CursorAdapter,并在列表中显示数据。 但我需要在开头展示一个额外的元素。 我怎样才能做到这一点?

我在某处读到可能可以用CursorWrapper完成,它可以在结果中注入额外的值。 但我不太清楚该怎么做。

如果有人可以给我一个例子(代码),或者有其他想法如何解决这个问题,请告诉我。 谢谢!

您可以使用列表视图的addHeaderView()或addFooterView() :

TextView label = new TextView(context); label.setText("Something Here"); listView.addHeaderView(label); 

请务必在调用setAdapter()之前这样做。

如我在这个问题中所建议的那样使用MergeCursorMatrixCursor的组合怎么样 : 如何在Spinner的SimpleCursorAdapter或Cursor中插入额外的元素?

像这样覆盖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); } 

您可以将Cursor数据读入List ,其中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查询。 EX:

(选择-1作为id,“HERE GOES THE NAME”作为名称,“HERE GOES THE ADDRESS”作为地址)UNION(从联系人名称中选择id,姓名,地址)

(请仔细检查语法,我是通过记忆做的)

这样,你得到第一行-1 |这里是名字|这里去地址加上剩下的行

因此,您不是“污染”数据库,并且很容易根据条件打开/关闭第一行并使用连接。