基础学习总结(五)---baseAdapter、ContentProvider

小写转大写 : ctrl+shift+F

<ScrollView></ScrollView>滚动条显示视图

ListView与BaseAdapter:

 1 public class MainActivity extends Activity {

 2     private List<Person> pList;

 3     @Override

 4     protected void onCreate(Bundle savedInstanceState) {

 5         super.onCreate(savedInstanceState);

 6         setContentView(R.layout.activity_main);

 7         

 8         ListView mlistview=(ListView)findViewById(R.id.listview);

 9         //把view与适配器关联

10         mlistview.setAdapter(new MyAdapter());

11     }

12 

13     class MyAdapter extends BaseAdapter{

14 

15         //获取view数据的长度

16         @Override

17         public int getCount() {

18             return pList.size();

19         }

20 

21         @Override

22         public Object getItem(int position) {

23             // TODO Auto-generated method stub

24             return null;

25         }

26 

27         @Override

28         public long getItemId(int position) {

29             // TODO Auto-generated method stub

30             return 0;

31         }

32 

33         //获得ListView中的某一行的view对象

34         //postion返回当前索引的位置

35         //convertView 缓存对象

36         //parent是listView对象

37         @Override

38         public View getView(int position, View convertView, ViewGroup parent) {

39             TextView tv=null;

40             if(convertView!=null){//判断缓存对象是否为空

41                 tv=(TextView)convertView;

42             }else{//等于null程序刚加载,则创建

43                 tv=new TextView(MainActivity.this);//类名.this  ==上下文

44             }

45             Person p=pList.get(position);//获得指定位置的数据,进行对TextView绑定  

46             tv.setText(p.toString());

47             return tv;

48             

49         }

50         

51         public View getView2(int position, View convertView, ViewGroup parent){

52             View view=null;

53             

54             if(convertView==null){

55                 //布局填充器对象,用于把xml布局转换成view对象

56                 LayoutInflater inflator= MainActivity2.this.getLayoutInflater();

57                 view=inflator.inflate(R.layout.listview2_item, null);

58             }else{

59                 view=convertView;

60             }

61             

62             //赋值

63             //。。。

64             return view;

65         }

66     }

67 }
View Code

ArrayAdapter与simpleAdapter:

 1 public class MainActivity extends Activity {

 2 

 3     @Override

 4     protected void onCreate(Bundle savedInstanceState) {

 5         super.onCreate(savedInstanceState);

 6         setContentView(R.layout.activity_main);

 7         

 8         ListView mlistview=(ListView)findViewById(R.id.list_view);

 9         

10         // ArrayAdapter适配器实例

11         String[] textArr={"a","b","c","d","e","f","g","h","i","t","z"};

12         //定义数据适配器

13         //用于显示简单的文本内容

14         //android.R.layout.simple_list_item_1 listview的子条目显示布局的id

15         //textArr 显示在list列表中的数据

16         ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,

17                 android.R.layout.simple_list_item_1,textArr);

18         mlistview.setAdapter(adapter);

19         

20         

21         //context 上下文

22         //data List<Map<String,Object>> data

23         //resource listview子条目布局的id

24         //from data数据中的map集合里的key

25         //to resource中的id

26         //SimpleAdapter adp=new SimpleAdapter(context,data,resource,from,to);

27         List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();

28         Map<String,Object> map=new HashMap<String,Object>();

29         map.put("name", "zhangsan1");

30         map.put("age", "17");

31         SimpleAdapter adp=new SimpleAdapter(this,data,R.layout.listview_item,

32                 new String[]{"name","age"},new int[]{R.id.tv_name,R.id.tv_ico});

33         mlistview.setAdapter(adp);

34     }

35     

36 }
View Code

ContentProvider:内容提供者抽象类

因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其它应用程序的数据。如果想公开你自己的数据,有两个选择:可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限。而外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及一些权限的问题。

 

实现ContentProvider抽象类需要在配置文件中声明:

//并赋读写权限
<provider android:name=".provider.PersonContentProvider"
android:authorities="包名+类名" android:readPermission="随便.read"
android:writePermission="随便2.write" >
</provider>

声明权限还需要在manifest节点下添加:
<manifest>
<permission android:name="随便.read"></permission>
<permission android:name="随便2.write"></permission>
</manifest>
并在对应访问的工程的Manifest.xml中注册(不然无法访问被拒绝):
<uses permission android:name="随便.read" />
<uses permission android:name="随便2.write" />

 1 public class PersonContentProvider extends ContentProvider{

 2     private static final String AUTHORITY="包名+类名";

 3     private static final int PERSON_INSERT_CODE=0;    //操作person表添加的操作uri匹配码

 4     private Static final int PERSON_DELETE_CODE=1;

 5     private Static final int PERSON_UPDATE_CODE=2;

 6     private Static final int PERSON_QUERYALL_CODE=3;

 7     private static UriMatcher uriMatcher;

 8     

 9     //Person表的数据库帮助对象

10     private PersonSQLiteOpenHelper mOpenHelper;

11     

12     static{

13         uriMatcher =new uriMatcher(UriMatcher.NO_MATH);

14         

15         //添加一些uri(分机号)

16         //content://包名+类名/person/insert

17         uriMatcher.addURI(AUTHORITY,"person/insert",PEROSON_INSERT_CODE);

18         uriMatcher.addURI(AUTHORITY,"person/delete",PERSON_DELETE_CODE);

19         uriMatcher.addURI(AUTHORITY,"person/update",PERSON_UPDATE_CODE);

20         uriMatcher.addURI(AUTHORITY,"person/queryall",PERSON_QUERYALL_CODE);

21     }

22     @override

23     public boolean onCreate(){

24         mOpenHelper=new PersonSQLiteOpenHelper(getContext());

25     }

26     

27     @override

28     public String getType(Uri uri){

29         

30     }

31     

32     @override

33     public Uri insert(Uri uri,ContentValues values){

34         switch(uriMatcher.match(uri)){

35             case PEROSON_INSERT_CODE:

36                 SQLiteDatabase db= mOpenHelper.getWriteableDatabase();

37                 if(db.isopen()){

38                     long  id = db.insert("person",null,values);

39                     db.close();

40                     return contentUris.withAppendedId(uri,id);

41                 }

42                 break;

43                 

44                 default:

45                 throw new IllegalArgumentException("uri不匹配":+uri);

46         }

47         return null;

48     }

49     

50     @override

51     public int delete(Uri uri,String selection,String[] selectionArgs){

52             //..

53     }

54     

55     @override

56     public int update(Uri uri,ConentValues values,String selection,String[] selectionArgs){

57         //...

58     }

59     

60     @override

61     public Curos query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder){

62         Switch(uriMatcher.match(uri)){

63             case PERSON_QUERYALL_CODE:

64                 SQLiteDatabase db=mOpenHelper.getReadableDatabase();

65                 if(db.isopen()){

66                     Cusor cor=db.query("person",projection,selection,selectionArgs,null,null,sortOrder);

67                     return cor;

68                     //db.close();返回cusor结果集时不可以关闭数据库

69                 }

70             break;

71             default:

72             throw new IllegalArgumentException("uri不匹配:"+uri);

73         }

74     }

75     

76 } 

77 

78 public class PersonContentResolver{

79     public void PersonInsert(){

80         Uri uri=Uri.Parser.("content://包名+类名/person/Insert");

81         

82         //内容提供者对象

83         ContentResolver resolver = getContext().getContentResolver();

84         ContentValues values=new ContentValues();

85         value.put("name","小风");

86         value.put("age","19");

87         

88         uri=resolver.insert(uri,values);

89         long id=ContentUris.parseId(uri);

90         log.i(tag,id);

91     }

92     

93 }
View Code

 

你可能感兴趣的:(ContentProvider)