【问题标题】:Add extra element to cursor adapter android向光标适配器android添加额外元素
【发布时间】:2012-09-11 15:32:20
【问题描述】:

我有一个包含数据库中所有行的光标。我将光标传递给 CursorAdapter,并在列表中显示数据。但我需要在一开始就展示一个额外的元素。我该怎么做?

我在某处读到,也许它可以用 CursorWrapper 完成,它可以为结果注入额外的值。但我不太确定该怎么做。

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

【问题讨论】:

    标签: android adapter element android-cursor


    【解决方案1】:

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

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

    请务必在致电 setAdapter() 之前这样做。

    【讨论】:

    • 这是我第一次看到一个真正解决了一个很好的用例的答案,并且很简单并且可以立即用于android 标签。非常感谢,我很惊讶这个答案没有被赞成。
    【解决方案2】:

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

    【讨论】:

    • 您不必将position - 1 传递给super.getView 吗?当您已经在列表中占据该位置时,适配器会知道从第一项开始?
    【解决方案3】:

    在这些情况下,我的解决方案是使用静态值执行 UNION 查询。例如:

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

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

    这样,您会得到第一行 -1|HERE GOES THE NAME|HERE GOES THE ADDRESS 加上其余行

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

    【讨论】:

      【解决方案4】:

      与向数据库添加额外字段类似,您可以向数据库中的投影添加额外字段。这为您节省了一点数据库空间并减少了信息冗余。这确实意味着每次访问都会重新计算该字段,而不仅仅是存储。

      这是我用来根据商品价格(以美分存储)和相关单位来格式化成本的投影示例。

      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;
      

      将其用作传递给列表视图的列,您可以直接将其与视图中的字段配对。

      【讨论】:

        【解决方案5】:

        按照我在这个问题中的建议,使用MergeCursorMatrixCursor 的组合怎么样:How to insert extra elements into a SimpleCursorAdapter or Cursor for a Spinner?

        【讨论】:

        • 我解决了这个问题,在数据库中添加了一个额外的元素。但也许可以使用您的建议来完成。 +1
        【解决方案6】:

        我最终通过在数据库中添加一个额外的元素来解决这个问题。这是最简单的解决方案,因为我一开始就需要额外的元素。因此,在创建我的数据库之后,我在表中插入了一行我需要额外元素的行,其中包含我想要的值。

        我还发现了这个讨论 [https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI],所以如果有人有类似的问题,这将是一个起点。谢谢!

        【讨论】:

        • 你也可以看到@amukhachov 的回答。
        • 我也做了同样的事情。这看起来像是一个非正式的最佳实践
        • 在您为用户提供删除/修改数据库条目的方法或出于任何原因需要重置数据库之前,这将是一个有点合理的解决方案。当然,如果您的条目是静态的,那么您可能无论如何都不应该使用数据库。我在上面的回答中提供了最简单、最面向未来的解决方案。
        【解决方案7】:

        您可以将Cursor 中的数据读入List<YourRow>,其中YourRow 是一个用于处理光标行数据的类。然后只需将新的YourRow 项目添加到列表并使用BaseAdapter 作为您的ListView。阅读this,了解如何处理BaseAdapter

        【讨论】:

        【解决方案8】:

        在适配器中,您可能可以在getView 方法中显示额外的数据。但这有点取决于数据来自哪里,你想用它做什么(只是显示它?)等等。

        【讨论】:

        • 我试过了,但是如果假设我在光标中有 6 个项目,getView 会被调用 6 次,所以当我添加额外的项目时,不会显示光标中的所有项目。总是有一个项目从未显示。这就是为什么我想在光标中添加额外的项目
        • 是的,但是当隐藏项出现时,适配器上会调用getView,不是吗?或者我真的很困惑!
        • 我试过这个:getView 会定期调用光标中的项目,如果 (position == 0) 我添加了我需要的额外项目。所以之后 getView 被调用以获取光标中的剩余项目,并且与额外的第一个项目一起,总是有一个项目永远不会显示。当我添加额外的项目时,我尝试再次调用 getView,但它无法正常工作。可能是因为我不知道在convertView里面放什么,从函数的父变量-> getView(int position, View convertView, ViewGroup parent)
        • 对不起!我完全误读了你想要的。我以为您想在数据集中添加一个额外的列,但似乎您想添加另一行(某种标题?或者只是另一个普通行?)。对吗?
        • 我最终在数据库中插入了另一行。这是当时最简单的解决方案。但无论如何,谢谢。
        猜你喜欢
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        相关资源
        最近更新 更多