zoukankan      html  css  js  c++  java
  • 无废话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("
    ");
            }
            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("
    ");
            }
            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" />
  • 相关阅读:
    iconv 文件编码转换
    source insight 中文注释为乱码解决
    c: c代码书写规范
    Ubuntu: 搭建tftp,nfs服务器
    Linux: 信息查看
    liteos时间管理(九)
    最大连续子数列和
    递归为什么那么慢?递归的改进算法
    liteos信号量(八)
    liteos互斥锁(七)
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/4222616.html
Copyright © 2011-2022 走看看