无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ListViewActivity" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </RelativeLayout> public class ListViewActivity extends Activity { private ListView lv;     public String tag = "ListViewActivity";  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_list_view);         lv = (ListView) findViewById(R.id.lv);         lv.setAdapter(new MyAdapter());  } /** * 自定义的数据适配器 * * @author Administrator * */ private class MyAdapter extends BaseAdapter { /** * 控制listview里面有多个条目. */ @Override public int getCount() { return 15;  } /** * 返回每个位置对应的view对象 */ @Override public View getView(int position, View convertView, ViewGroup parent) { // 这个方法被调用了多少次? Log.i(tag, "POSITION:" + position);             TextView tv = new TextView(ListViewActivity.this);             tv.setTextSize(30);             tv.setTextColor(Color.RED);             tv.setText("我是第" + position + "个条目");             return tv;  } @Override public Object getItem(int position) { return null;  } @Override public long getItemId(int position) { return 0;  } } } 2.采用layoutInflater打气筒创建一个view对象 在上面的基础上添加list_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#000000" /> <TextView android:id="@+id/tv_number" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> /** * 返回每个位置对应的view对象 */ @Override public View getView(int position, View convertView, ViewGroup parent) { // 这个方法被调用了多少次? Log.i(tag, "POSITION:" + position);     View view = View.inflate(getApplicationContext(), R.layout.list_item, null);     TextView tv_name = (TextView) view.findViewById(R.id.tv_name);     TextView tv_number = (TextView) view.findViewById(R.id.tv_number);     tv_name.setText("name:"+position);     tv_number.setText(position+"");     return view; } 3.常用数据适配器ArrayAdapter protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_list_view);         lv = (ListView) findViewById(R.id.lv);         lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, R.id.tv_name, new String[] { "aaaa", "bbbb", "cccc", "ddddd" })); } 4.常用数据适配器SimpleAdapter protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_list_view);         lv = (ListView) findViewById(R.id.lv);  List<Map<String, String>> data = new ArrayList<Map<String, String>>();  Map<String, String> item1 = new HashMap<String, String>();         item1.put("name", "zhangsna");         item1.put("number", "124245");  Map<String, String> item2 = new HashMap<String, String>();         item2.put("name", "lisi");         item2.put("number", "4545");  data.add(item1);         data.add(item2);  lv.setAdapter(new SimpleAdapter(this, data, R.layout.list_item, new String[] { "name", "number" }, new int[] { R.id.tv_name, R.id.tv_number }));  } 5.使用ContentProvider(内容提供者)共享数据 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。 如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一 使用ContentProvider对外共享数据的好处是统一了数据的访问方式。 定义一个类继承ContentProvider类 package com.itheima.contentprovider;  import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;  import com.example.demo1.db.PersonSQLiteOpenHelper;  public class PersonProvider extends ContentProvider { // 定义一个uri匹配器,用于匹配uri,如果匹配不成功返回-1 private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);     private static final int INSERT = 1;     private static final int DELETE = 2;     private static final int UPDATE = 3;     private static final int QUERY = 4;     private static final int QUERYONE = 5;     private static final Uri URI = Uri.parse("content://person.db");  private PersonSQLiteOpenHelper helper;  static { // 添加一组匹配规则 // authority: the authority to match // path: the path to match. * may be used as a wild card for any text, // and # may be used as a wild card for numbers. // code: the code that is returned when a URI is matched against the // given components. Must be positive. matcher.addURI("com.itheima.contentprovider.personprovider", "insert", INSERT);         matcher.addURI("com.itheima.contentprovider.personprovider", "delete", DELETE);         matcher.addURI("com.itheima.contentprovider.personprovider", "update", UPDATE);         matcher.addURI("com.itheima.contentprovider.personprovider", "query", QUERY);         matcher.addURI("com.itheima.contentprovider.personprovider", "query/#", QUERYONE);  } @Override public boolean onCreate() { this.helper = new PersonSQLiteOpenHelper(getContext());         return false;  } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (matcher.match(uri) == QUERY) { SQLiteDatabase db = helper.getReadableDatabase();             Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);  // 注意这里的db和cursor不能关闭 return cursor;         } else if (matcher.match(uri) == QUERYONE) { SQLiteDatabase db = helper.getReadableDatabase();             long id = ContentUris.parseId(uri);             Cursor cursor = db.query("person", projection, "id=?", new String[] { id + "" }, null, null, sortOrder);  // 注意这里的db和cursor不能关闭 return cursor;  } else { throw new IllegalArgumentException("非法uri");  } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { if (matcher.match(uri) == DELETE) { SQLiteDatabase db = helper.getWritableDatabase();  // 注册内容观测者 getContext().getContentResolver().notifyChange(URI, null);             return db.delete("person", selection, selectionArgs);  } else { throw new IllegalArgumentException("非法uri");  } } @Override public Uri insert(Uri uri, ContentValues values) { if (matcher.match(uri) == INSERT) { SQLiteDatabase db = helper.getWritableDatabase();             long id = db.insert("person", null, values);             getContext().getContentResolver().notifyChange(URI, null);  // 返回指定的Uri路劲对象 // content://cn.itcast.provider.custom.usersprovider/users/1 return ContentUris.withAppendedId(uri, id);  } else { throw new IllegalArgumentException("非法uri");  } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if (matcher.match(uri) == UPDATE) { SQLiteDatabase db = helper.getWritableDatabase();             getContext().getContentResolver().notifyChange(URI, null);             return db.update("person", values, selection, selectionArgs);  } else { throw new IllegalArgumentException("非法uri");  } } /** * Implement this to handle requests for the MIME type of the data at the * given URI. The returned MIME type should start with * vnd.android.cursor.item for a single record, or vnd.android.cursor.dir/ * for multiple items. This method can be called from multiple threads, as * described in Processes and Threads. */ @Override public String getType(Uri uri) { if (matcher.match(uri) == QUERY) { return "vnd.android.cursor.dir/person";         } else if (matcher.match(uri) == QUERYONE) { return "vnd.android.cursor.item/person";  } else { return "";  } } } 定义一个类继承SQLiteOpenHelper类 package com.example.demo1.db;  import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;  public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { private static final String DBFILENAME = "person.db";     private static int db_version = 1;  public PersonSQLiteOpenHelper(Context context) { super(context, DBFILENAME, null, db_version);  } /** * 当数据库第一次创建时调用 */ @Override public void onCreate(SQLiteDatabase db) { String sql = "create table person(id integer primary key autoincrement,name varchar(20),number varchar(20))";         db.execSQL(sql);  } /** * 当数据库的版本号发生增加的时候调用 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("数据库更改!");         String sql = "alter table person add account varchar(20)";         db.execSQL(sql);  } } 清单文件中注册内容提供者 <provider android:name="com.itheima.contentprovider.PersonProvider" android:authorities="com.itheima.contentprovider.personprovider" ></provider> 第三方软件 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);  } public void getAll(View view) { ContentResolver resolver = this.getContentResolver();         Uri uri = Uri .parse("content://com.itheima.contentprovider.personprovider/query");         Cursor cursor = resolver.query(uri, null, null, null, null);         StringBuffer sb = new StringBuffer();  while (cursor.moveToNext()) { sb.append(cursor.getString(cursor.getColumnIndex("name")) + " -- " + cursor.getString(cursor.getColumnIndex("number")));             sb.append("\n");  } TextView tv_info = (TextView) this.findViewById(R.id.tv_info);         tv_info.setText(sb.toString());         cursor.close();  } public void getOne(View view) { ContentResolver resolver = this.getContentResolver();         // Uri uri = Uri // .parse("content://com.itheima.contentprovider.personprovider/query");         // Cursor cursor = resolver.query(uri, null, "id=?",new String[]{"1"} , // null);         Uri uri = Uri.parse("content://com.itheima.contentprovider.personprovider/query/1");         Cursor cursor = resolver.query(uri, null, null, null, null);         StringBuffer sb = new StringBuffer();  if (cursor.moveToFirst()) { sb.append(cursor.getString(cursor.getColumnIndex("name")) + " -- " + cursor.getString(cursor.getColumnIndex("number")));             sb.append("\n");  } TextView tv_info = (TextView) this.findViewById(R.id.tv_info);         tv_info.setText(sb.toString());         cursor.close();  } public void insert(View view) { ContentResolver resolver = this.getContentResolver();         Uri uri = Uri.parse("content://com.itheima.contentprovider.personprovider/insert");         ContentValues values = new ContentValues();         values.put("name", "reality");         values.put("number", "567");         Uri result = resolver.insert(uri, values);         System.out.println("result = " + result);  } public void update(View view) { ContentResolver resolver = this.getContentResolver();         Uri uri = Uri .parse("content://com.itheima.contentprovider.personprovider/update");         ContentValues values = new ContentValues();         values.put("name", "dog");         values.put("number", "110");         int result = resolver.update(uri, values, "id=?", new String[] { "1" });         System.out.println("result = " + result);  } public void delete(View view) { ContentResolver resolver = this.getContentResolver();         Uri uri = Uri .parse("content://com.itheima.contentprovider.personprovider/delete");         int result = resolver.delete(uri, "id=?", new String[] { "3" });         System.out.println("result = " + result);  } } 6.短信的备份 public class BackupsmsActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_backupsms);  } public void backupSMS(View view) { Uri uri = Uri.parse("content://sms");         ContentResolver resolver = this.getContentResolver();         Cursor cursor = resolver.query(uri, new String[] { "date", "body",

                "address", "type" }, null, null, null);         ArrayList<SmsInfo> infos = new ArrayList<SmsInfo>();  while (cursor.moveToNext()) { long date = cursor.getLong(0);             String body = cursor.getString(1);             String address = cursor.getString(2);             int type = cursor.getInt(3);             SmsInfo smsInfo = new SmsInfo(date, body, address, type);             infos.add(smsInfo);  } SmsUtil.save(this, infos);  } } public class SmsUtil { public static void save(Context context, ArrayList<SmsInfo> infos) { XmlSerializer xmlSerializer = Xml.newSerializer();         File file = new File(Environment.getExternalStorageDirectory(),

                "sms_bak.xml");//mnt/sdcard/sms_bak.xml

 try { FileOutputStream fos = new FileOutputStream(file);             xmlSerializer.setOutput(fos, "utf-8");             xmlSerializer.startDocument("utf-8", true);  xmlSerializer.startTag(null, "smss");  for (SmsInfo info : infos) { xmlSerializer.startTag(null, "sms");                 xmlSerializer.attribute(null, "type", info.getType() + "");  xmlSerializer.startTag(null, "date");                 xmlSerializer.text(info.getDate() + "");                 xmlSerializer.endTag(null, "date");  xmlSerializer.startTag(null, "address");                 xmlSerializer.text(info.getAddress());                 xmlSerializer.endTag(null, "address");  xmlSerializer.startTag(null, "body");                 xmlSerializer.text(info.getBody());                 xmlSerializer.endTag(null, "body");  xmlSerializer.endTag(null, "sms");  } xmlSerializer.endTag(null, "smss");  xmlSerializer.endDocument();             fos.close();             Toast.makeText(context, "保存成功", 0).show();  } catch (Exception e) { e.printStackTrace();             Toast.makeText(context, "保存失败", 0).show();  } } } public class SmsInfo { private int id;     private long date;     private String body;     private String address;     private int type;  public SmsInfo() { super();  // TODO Auto-generated constructor stub } public SmsInfo(int id, long date, String body, String address) { super();         this.id = id;         this.date = date;         this.body = body;         this.address = address;  } public SmsInfo(long date, String body, String address, int type) { super();         this.date = date;         this.body = body;         this.address = address;         this.type = type;  } public int getType() { return type;  } public void setType(int type) { this.type = type;  } public int getId() { return id;  } public void setId(int id) { this.id = id;  } public long getDate() { return date;  } public void setDate(long date) { this.date = date;  } public String getBody() { return body;  } public void setBody(String body) { this.body = body;  } public String getAddress() { return address;  } public void setAddress(String address) { this.address = address;  } } 7.插入一条记录到系统短信应用 public class InsertsmsActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);         setContentView(R.layout.activity_insertsms);  new Thread() { public void run() { try { Thread.sleep(10000);                     Uri uri = Uri.parse("content://sms");                     ContentResolver resolver = getContentResolver();                     ContentValues values = new ContentValues();                     values.put("address", "10086");                     values.put("type", 1);                     values.put("date", System.currentTimeMillis());                     values.put("body", "您的余额还有100,000,000元!");                     resolver.insert(uri, values);  } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();  } } }.start();  } } <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" />

 

你可能感兴趣的:(ContentProvider)