如果想得到一个Cursor, 而此时又没有数据库返回一个Cursor,此时可以通过MatrixCursor来返回一个伪造的Cursor。比如一个程序在一般情况下用getContentReslover.query从数据库查询数据,但是在很特殊的某条件下,需要返回的只是几条固定的已知记录,不需要从数据库查询,但是为了最终结果能被调用他的方法使用,我们还是希望返回的是Cursor,那么就需要MatrixCursor根据这些已知的记录来构造一个Cursor。
也许这里有一个疑问:为什么Cursor自己不能构造一些数据呢?
因为Cursor只是一个interface,不是一个具体的类,getContentReslover.query返回的其实也不是Cursor而是Cursor的一种实现。
_id | name | price |
R.drawable.ic_launcher | row1 | 39 |
R.drawable.ic_launcher | row2 | 40 |
R.drawable.ic_launcher | row3 | 41 |
R.drawable.ic_launcher | row4 | 42 |
package com.test.matrixcursor; import android.app.ListActivity; import android.database.MatrixCursor; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends ListActivity { private static final String[] COLUMN_NAME = { "_id", "name", "price" }; private MatrixCursor matrixCursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); createList(); //createList2(); } private void createList() { matrixCursor = new MatrixCursor(COLUMN_NAME, 1); matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "row1", 39 }); matrixCursor .addRow(new Object[] { R.drawable.ic_launcher, "row2", 40 }); matrixCursor .addRow(new Object[] { R.drawable.ic_launcher, "row3", 41 }); matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "row4", 42 }); matrixCursor .addRow(new Object[] { R.drawable.ic_launcher, "row5", 43 }); setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main, matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name, R.id.price })); } //第二种添加row的方式 private void createList2() { matrixCursor = new MatrixCursor(COLUMN_NAME, 1); MatrixCursor.RowBuilder builder1 = matrixCursor.newRow(); builder1.add(R.drawable.ic_launcher); builder1.add("row1"); builder1.add(39); MatrixCursor.RowBuilder builder2 = matrixCursor.newRow(); builder2.add(R.drawable.ic_launcher); builder2.add("row2"); builder2.add(40); MatrixCursor.RowBuilder builder3 = matrixCursor.newRow(); builder3.add(R.drawable.ic_launcher); builder3.add("row3"); builder3.add(41); setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main, matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name, R.id.price })); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); matrixCursor.moveToPosition(position); StringBuilder builder = new StringBuilder(); builder.append("Name:") .append(matrixCursor.getString(matrixCursor .getColumnIndex("name"))).append("\n"); builder.append("Price:") .append(matrixCursor.getString(matrixCursor .getColumnIndex("price"))).append("\n"); Toast.makeText(getApplicationContext(), builder.toString(), 1000) .show(); } }
MatrixCursor matrixCursor=new MatrixCursor(COLUMN_NAME);
matrixCursor = new MatrixCursor(COLUMN_NAME, 10);
matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "zhangsan",39 });
MatrixCursor.RowBuilder builder1 = matrixCursor.newRow(); builder1.add(R.drawable.ic_launcher); builder1.add("zhangsan"); builder1.add(39);