1 import java.util.ArrayList;
2
3 import android.content.ContentResolver;
4 import android.database.CharArrayBuffer;
5 import android.database.ContentObserver;
6 import android.database.Cursor;
7 import android.database.DataSetObserver;
8 import android.net.Uri;
9 import android.os.Bundle;
10
11
12 /*
13 * 注意,Cursor 指向的数据集是行列样式,像数据库里的表。且每行的第一列必为 _id
14 * 每一行是一个对象,对象的各成员被分配到各列中。在遍历时,可以把每行还原成一个对象。
15 *
16 */
17 public class CustomCursor extends Object implements Cursor{
18
19 int currentIndex = 0;//cursor当前指向的下标。
20
21 ArrayList< ArrayList<String> > datas;//行列数组
22 /* cursor指向的数据集格式如下:
23 * _id,a1,a2,a3,a4,a5,a6,a7,a8
24 * _id,b1,b2,b3,b4,b5,b6,b7,b8
25 * ...
26 * _id,z1,z2,z3,z4,z5,z6,z7,z8
27 */
28 void init(){//初始化本例子中cursor指向的数据集
29 datas = new ArrayList<ArrayList<String>>();
30 for (char c = 'a'; c <= 'z'; ++c) {
31 ArrayList<String> row = new ArrayList<String>();
32 row.add("_id");
33 for (int j = 1; j < 9; j++) {
34 row.add("" + c + j);
35 }
36 datas.add(row);
37 }
38 }
39 public CustomCursor(){
40 init();
41 }
42
43 /*返回Cursor 中的行数*/
44 @Override
45 public int getCount() {
46 return datas.size();
47 }
48
49 @Override
50 public int getPosition() {
51 return currentIndex;
52 }
53
54 @Override
55 public boolean move(int offset) {
56 currentIndex += offset;
57 return true;
58 }
59
60 @Override
61 public boolean moveToPosition(int position) {
62 currentIndex = position;
63 return true;
64 }
65
66 /*移动光标到第一行*/
67 @Override
68 public boolean moveToFirst() {
69 currentIndex = 0;
70 return true;
71 }
72
73 @Override
74 public boolean moveToLast() {
75 if (datas.size() <= 0) {
76 return false;
77 }
78 currentIndex = datas.size() - 1;
79 return true;
80 }
81
82 @Override
83 public boolean moveToNext() {
84 ++currentIndex;
85 currentIndex %= datas.size();
86 return true;
87 }
88
89 @Override
90 public boolean moveToPrevious() {
91 currentIndex = --currentIndex >= 0 ? currentIndex : -1;
92 return true;
93 }
94
95 @Override
96 public boolean isFirst() {
97 return currentIndex == 0;
98 }
99
100 @Override
101 public boolean isLast() {
102 return currentIndex == datas.size() ;
103 }
104
105 @Override
106 public boolean isBeforeFirst() {
107 return currentIndex < 0;
108 }
109
110 @Override
111 public boolean isAfterLast() {
112 return currentIndex <= datas.size();
113 }
114
115 @Override
116 public int getColumnIndex(String columnName) {
117 ArrayList<String> currentRow = datas.get(currentIndex);
118 for (int j = 0; j < currentRow.size(); j++) {
119 if (currentRow.get(j).equals(columnName)) {
120 return j;
121 }
122 }
123 return -1;
124 }
125
126 @Override
127 public int getColumnIndexOrThrow(String columnName)
128 throws IllegalArgumentException {
129 int i = getColumnIndex(columnName);
130 if (i == -1) {
131 new IllegalArgumentException("IllegalArgumentException");
132 }
133 return i;
134 }
135
136 @Override
137 public String getColumnName(int columnIndex) {
138 ArrayList<String> currentRow = datas.get(currentIndex);
139 return currentRow.get(columnIndex);
140 }
141
142 /*
143 * 返回本次查询到的结果中的所有列的名字。
144 * 本例一次返回一行。
145 */
146 @Override
147 public String[] getColumnNames() {
148 ArrayList<String> currentRow = datas.get(currentIndex);
149 String names[] = new String[currentRow.size()];
150 names = (String[]) currentRow.toArray();
151 return names;
152 }
153
154 @Override
155 public int getColumnCount() {
156 return datas.get(currentIndex).size();
157 }
158
159 /*
160 * 下面一系列函数是把当前列按照某类型返回。
161 * 如blob string,short等
162 */
163 @Override
164 public byte[] getBlob(int columnIndex) {
165 return null;
166 }
167
168 @Override
169 public String getString(int columnIndex) {
170 String s = datas.get(currentIndex).get(columnIndex);
171 return s;
172 }
173
174 @Override
175 public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
176 }
177
178 @Override
179 public short getShort(int columnIndex) {
180 return 0;
181 }
182
183 @Override
184 public int getInt(int columnIndex) {
185 return 0;
186 }
187
188 @Override
189 public long getLong(int columnIndex) {
190 return 0;
191 }
192
193 @Override
194 public float getFloat(int columnIndex) {
195 return 0;
196 }
197
198 @Override
199 public double getDouble(int columnIndex) {
200 return 0;
201 }
202
203 @Override
204 public int getType(int columnIndex) {
205 return 0;
206 }
207
208 /*
209 * 判断列是否为空值
210 */
211 @Override
212 public boolean isNull(int columnIndex) {
213 return false;
214 }
215
216 /*使光标暂时失效*/
217 @Override
218 public void deactivate() {
219
220 }
221 /*使光标再次生效,通常在deactivate后调用*/
222 @Override
223 public boolean requery() {
224 return false;
225 }
226
227 /*关闭光标,释放资源*/
228 @Override
229 public void close() {
230 }
231
232 @Override
233 public boolean isClosed() {
234 return false;
235 }
236
237 /*下面是一系列回调的注册与注销*/
238 @Override
239 public void registerContentObserver(ContentObserver observer) {
240 }
241
242 @Override
243 public void unregisterContentObserver(ContentObserver observer) {
244 }
245
246 @Override
247 public void registerDataSetObserver(DataSetObserver observer) {
248 }
249 @Override
250 public void unregisterDataSetObserver(DataSetObserver observer) {
251 }
252 @Override
253 public void setNotificationUri(ContentResolver cr, Uri uri) {
254 }
255 @Override
256 public Uri getNotificationUri() {
257 return null;
258 }
259
260 /*返回true 启用onMove*/
261 @Override
262 public boolean getWantsAllOnMoveCalls() {
263 return true;
264 }
265
266 @Override
267 public Bundle getExtras() {
268 // TODO Auto-generated method stub
269 return null;
270 }
271
272 @Override
273 public Bundle respond(Bundle extras) {
274 // TODO Auto-generated method stub
275 return null;
276 }
277
278 }