Android自定义Cursor遇到的一个小问题

Android应用很多情况下存储大量数据都会用SQliter,使用sqlliter不免要和cursor打交道,灵活使用cursor会省很多事。如将自己的数据组合在一个虚拟的表中(数据集合),通过Provider以cursor形式返回给用户,还可以规定cursor每取一次返回多少记录,以减少UI数据量大的负载压力。(如果只是封装下数据以cursor方式返回,MetrixCursor可以完成此需求,其publicvoid
addRow (Object[]columnValues)方法可以帮你维护添加进去的对象数组数据)。

具体实现代码如下:

final Map<String, String>  data = new HashMap<String, String>();
        data.put("wifi","on");
        Cursor cursor = new AbstractCursor() {

            private String[] names;

            /**
             * 记录数
             * @return
             */
            @Override
            public int getCount() {
                return data.size() > 0 ? 1 : 0;
            }

            /**
             * 获取每一列的名称,对于SharedPreferences 就是每一个key
             * @return
             */
            @Override
            public String[] getColumnNames() {
                if(names == null) {
                    names = new String[0];

                    if (!data.isEmpty()) {
                        names = new String[data.size()];
                        Set<String> keySet = data.keySet();
                        <span style="color:#ff0000;">names = (String[])keySet.toArray(new String[0]);</span>
                    }
                }

                return names;
            }

            @Override
            public String getString(int column) {
                String key = names[column];

                return (String)data.get(key);
            }

            @Override
            public short getShort(int column) {
                return 0;
            }

            @Override
            public int getInt(int column) {
                return 0;
            }

            @Override
            public long getLong(int column) {
                return 0;
            }

            @Override
            public float getFloat(int column) {
                return 0;
            }

            @Override
            public double getDouble(int column) {
                return 0;
            }

            @Override
            public boolean isNull(int column) {
                return false;
            }
        };

红色部分是要注意的代码,开始是这么写的:

 if(names == null) {
                            names = new String[0];

                            if (!data.isEmpty()) {
                                names = new String[data.size()];
                                Set<String> keySet = data.keySet();
                                int i = 0;
                                for (String key : keySet) {
                                    names[i++] = key;
                                }
                            }
                        }

但是Set有提供的转成Array的方法toArray(),于是改成了

 <span style="color:#ff0000;">names = (String[])keySet.toArray();</span>

但是结果是错误的,打断点跟踪后发现cursor中是有数据的,但是如果取得花是会出错的。

对于Set而言,它只知道它内部保存的是Object,所以默认情况下,toArray只能是返回一个由这些Object构成的Object数组出来。

但程序的作者或许更清楚其内部元素的更具体的类型,因此,Set类提供了toArray的另一个重载版本,允许用户指定一种比Object[]更具体的数组类型,方法是传递一个用户想要的数组类型的一个数组实例进去,多长都无所谓(因此我们常常使用一个0长度的,毕竟把类型带进去就OK了),于是,toArray内部就会按照你想要的这种类型,给构造一个数组出来。这样构造出来的数组,当然是很安全地被调用者转换回那个实际的类型。

参考:http://bbs.csdn.net/topics/100149308

时间: 2024-10-06 14:36:26

Android自定义Cursor遇到的一个小问题的相关文章

Android自定义View--自己撸一个柱状图也没那么难

绪论 *转眼间,2016伴随着互联网寒冬和帝都的雾霾马上就过去了,不知道大家今年一整年过得怎么样?最近票圈被各个城市的雾霾刷屏, 内心难免会动荡,庆幸自己早出来一年,也担忧着自己的未来的职业规划.无所谓了,既然选择了这个行业,我觉得大家就应该坚持下去,路是自己走的,及时再寒冬,只要你足够优秀,足够努力,相信你最后还是会找到自己满意的工作的.最后还要感谢今年博客之星大家对我的投票支持,非常感谢.不多说了,今天的主题是它–对,自定义View柱状图. 先来说说我最近在做什么吧?好久没有写博客了,最近手

Android开发中padding使用一个小技巧

在安卓应用开发中,有时要用到状态按钮(可点击时与不可点击时的背景不相同),而且产品要求的按钮大小是固定的.在不同的手机上按钮的文字显示可能有些异常(主要是在给按钮做背景时很容易出现),此时我们怎么处理呢?我们可以用到padding这个属性. 看看小例子: --------------------------就一个按钮,但是background是用xml文件写的状态selector-------------------------------- <Button android:id="@+i

自定义绘制图片的一个小技巧

要在picturebox中自由绘制图片,一开始将绘制函数写入在Paint中 public void ff_Paint(object sender, PaintEventArgs e) { CreatShow(Graphics.FromHwnd(fpic.Handle)); //这样卡爆了. } void fpic_Paint(object sender, PaintEventArgs e) { CreatShow(e.Graphics); //这样卡爆了. } 结果加载了几张图片后,程序就卡爆了

android 支持分组和联系人展示的一个小例子

先看效果图: 要实现这个效果,activity必须实现ExpandableListActivity @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); mContactListView = getExpa

Android笔记2——开发前奏2工程目录介绍和一个小应用

转载请注明http://www.cnblogs.com/devtrees/p/4405519.html 一.创建第一个应用HelloWorld (一)创建步骤: 1.New出一个Android Application Project 三种方式 1): 2): 3): 2.会出现下图的窗口: 分别是:应用名:给用户看的 工程名:开发工具中显示的项目名 包名: 客户端中设置->应用->应用列表中显示的名字 兼容的最低版本: 兼容的最高版本: 开发基于的版本:(一般将兼容的最高版本和开发所基于的版本

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

================================================================================== [1 序言] 侧滑删除的轮子网上有很多,最初在github上看过一个,还是ListView时代,那是一个自定义ListView 实现侧滑删除的,当初就觉得这种做法不是最佳,万一我项目里又同时有自定义ListView的需求,会增加复杂度. 写这篇文章之前又通过毒度搜了一下,排名前几的CSDN文章,都是通过自定义ListVIew和Vie

恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view

猴年猴赛雷啊各位,今天没吃药我感觉自己萌萌哒! qq和微信和支付宝红包大战,不知道各位的战绩是多少嘞? 反正我qq抢到的都是气泡.因为太不爽,所以自己写一个下拉抢红包自己玩(自己跟自己玩). 先来看效果图.这个-- 呃~~ -__-" ..有点丑 是低仿. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50662592 学习完本篇博客你能获得到的知识 正确的获得view的大小 listview的下拉header 自定义字体 自己添加

Android应用之自定义Cursor

Android应用之自定义Cursor Android应用很多情况下存储大量数据都会用SQliter,使用sqlliter不免要和cursor打交道,灵活使用cursor会省很多事.如将自己的数据组合在一个虚拟的表中(数据集合),通过Provider以cursor形式返回给用户,还可以规定cursor每取一次返回多少记录,以减少UI数据量大的负载压力.(如果只是封装下数据以cursor方式返回,MetrixCursor可以完成此需求,其publicvoid addRow (Object[]col

用android去写一个小程序

前言: 软工的一个小作业:实现"黄金分割小游戏", 需要结对编程,队友:陈乐云(http://www.cnblogs.com/clyln/),用时两天. 早期思路设计: 采用键值对的形式,以Map作为存储结构.优点:能够将数据与用户对应,缺点:采用java实现过于复杂,工程量过大,需要消耗大量资源,类型转换容易出错. 后期思路设计: 采用二维数组:第一行用于存储用户输入原始数据,第二行用于存储中间数据(第一行的与G值做差的绝对值),第三行用于保存用户得分. 优点:实现简单,易于运算 分