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

时间:2012-09-19 10:20:00

标签: android cursor element adapter

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

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

如果有人可以告诉我一个例子(代码),或者想知道如何解决这个问题,请告诉我。 THX!

8 个答案:

答案 0 :(得分:10)

如我在此问题中所建议的那样使用MergeCursorMatrixCursor的组合怎么样: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 |这里是名字|这里去地址加上剩下的行

所以,你不是在“污染”数据库,而且很容易用条件打开/关闭第一行并使用连接。