Android应用程序组件Content Provider应用实例(3)
下面是ArticlesAdapter类的实现,它实现在src/shy/luo/ArticlesAdapter.java文件中: packageshy.luo.article; importjava.util.LinkedList; importshy.luo.providers.articles.Articles; importandroid.content.ContentResolver; importandroid.content.ContentUris; importandroid.content.ContentValues; importandroid.content.Context; importandroid.content.IContentProvider; importandroid.database.Cursor; importandroid.net.Uri; importandroid.os.Bundle; importandroid.os.RemoteException; importandroid.util.Log; publicclassArticlesAdapter{ privatestaticfinalStringLOG_TAG="shy.luo.article.ArticlesAdapter"; privateContentResolverresolver=null; publicArticlesAdapter(Contextcontext){ resolver=context.getContentResolver(); } publiclonginsertArticle(Articlearticle){ ContentValuesvalues=newContentValues(); values.put(Articles.TITLE,article.getTitle()); values.put(Articles.ABSTRACT,article.getAbstract()); values.put(Articles.URL,article.getUrl()); Uriuri=resolver.insert(Articles.CONTENT_URI,values); StringitemId=uri.getPathSegments().get(1); returnInteger.valueOf(itemId).longValue(); } publicbooleanupdateArticle(Articlearticle){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,article.getId()); ContentValuesvalues=newContentValues(); values.put(Articles.TITLE,article.getTitle()); values.put(Articles.ABSTRACT,article.getAbstract()); values.put(Articles.URL,article.getUrl()); intcount=resolver.update(uri,values,null,null); returncount>0; } publicbooleanremoveArticle(intid){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,id); intcount=resolver.delete(uri,null,null); returncount>0; } publicLinkedList<Article>getAllArticles(){ LinkedList<Article>articles=newLinkedList<Article>(); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(Articles.CONTENT_URI,projection,null,null,Articles.DEFAULT_SORT_ORDER); if(cursor.moveToFirst()){ do{ intid=cursor.getInt(0); Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); Articlearticle=newArticle(id,title,abs,url); articles.add(article); }while(cursor.moveToNext()); } returnarticles; } publicintgetArticleCount(){ intcount=0; try{ IContentProviderprovider=resolver.acquireProvider(Articles.CONTENT_URI); Bundlebundle=provider.call(Articles.METHOD_GET_ITEM_COUNT,null,null); count=bundle.getInt(Articles.KEY_ITEM_COUNT,0); }catch(RemoteExceptione){ e.printStackTrace(); } returncount; } publicArticlegetArticleById(intid){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,id); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(uri,projection,null,null,Articles.DEFAULT_SORT_ORDER); Log.i(LOG_TAG,"cursor.moveToFirst"); if(!cursor.moveToFirst()){ returnnull; } Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); returnnewArticle(id,title,abs,url); } publicArticlegetArticleByPos(intpos){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_POS_URI,pos); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(uri,projection,null,null,Articles.DEFAULT_SORT_ORDER); if(!cursor.moveToFirst()){ returnnull; } intid=cursor.getInt(0); Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); returnnewArticle(id,title,abs,url); } } 这个类首先在构造函数里面获得应用程序上下文的ContentResolver接口,然后通过就可以通过这个接口来访问ArticlesProvider中的文章信息了。成员函数insertArticle、updateArticle和removeArticle分别用来新增、更新和删除一个文章信息条目;成员函数getAllArticlese用来获取所有的文章信息;成员函数getArticleById和getArticleByPos分别根据文章的ID和位置来获得具体文章信息条目;成员函数getArticleCount直接使用ContentProvider的未公开接口call来获得文章信息条目的数量,注意,这个函数要源代码环境下编译才能通过。 下面是程序主界面MainActivity类的实现,它实现在src/shy/luo/article/MainActivity.java文件中: packageshy.luo.article; importshy.luo.providers.articles.Articles; importandroid.app.Activity; importandroid.content.Context; importandroid.content.Intent; importandroid.database.ContentObserver; importandroid.os.Bundle; importandroid.os.Handler; importandroid.util.Log; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.AdapterView; importandroid.widget.BaseAdapter; importandroid.widget.Button; importandroid.widget.ListView; importandroid.widget.TextView; publicclassMainActivityextendsActivityimplementsView.OnClickListener,AdapterView.OnItemClickListener{ privatefinalstaticStringLOG_TAG="shy.luo.article.MainActivity"; privatefinalstaticintADD_ARTICAL_ACTIVITY=1; privatefinalstaticintEDIT_ARTICAL_ACTIVITY=2; privateArticlesAdapteraa=null; privateArticleAdapteradapter=null; privateArticleObserverobserver=null; privateListViewarticleList=null; privateButtonaddButton=null; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); aa=newArticlesAdapter(this); articleList=(ListView)findViewById(R.id.listview_article); adapter=newArticleAdapter(this); articleList.setAdapter(adapter); articleList.setOnItemClickListener(this); observer=newArticleObserver(newHandler()); getContentResolver().registerContentObserver(Articles.CONTENT_URI,true,observer); addButton=(Button)findViewById(R.id.button_add); addButton.setOnClickListener(this); Log.i(LOG_TAG,"MainActivityCreated"); } @Override publicvoidonDestroy(){ super.onDestroy(); getContentResolver().unregisterContentObserver(observer); } @Override publicvoidonClick(Viewv){ if(v.equals(addButton)){ Intentintent=newIntent(this,ArticleActivity.class); startActivityForResult(intent,ADD_ARTICAL_ACTIVITY); } } @Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intpos,longid){ Intentintent=newIntent(this,ArticleActivity.class); Articlearticle=aa.getArticleByPos(pos); intent.putExtra(Articles.ID,article.getId()); intent.putExtra(Articles.TITLE,article.getTitle()); intent.putExtra(Articles.ABSTRACT,article.getAbstract()); intent.putExtra(Articles.URL,article.getUrl()); startActivityForResult(intent,EDIT_ARTICAL_ACTIVITY); } @Override publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); switch(requestCode){ caseADD_ARTICAL_ACTIVITY:{ if(resultCode==Activity.RESULT_OK){ Stringtitle=data.getStringExtra(Articles.TITLE); Stringabs=data.getStringExtra(Articles.ABSTRACT); Stringurl=data.getStringExtra(Articles.URL); Articlearticle=newArticle(-1,title,abs,url); aa.insertArticle(article); } break; } caseEDIT_ARTICAL_ACTIVITY:{ if(resultCode==Activity.RESULT_OK){ intaction=data.getIntExtra(ArticleActivity.EDIT_ARTICLE_ACTION,-1); if(action==ArticleActivity.MODIFY_ARTICLE){ intid=data.getIntExtra(Articles.ID,-1); Stringtitle=data.getStringExtra(Articles.TITLE); Stringabs=data.getStringExtra(Articles.ABSTRACT); Stringurl=data.getStringExtra(Articles.URL); Articlearticle=newArticle(id,title,abs,url); aa.updateArticle(article); }elseif(action==ArticleActivity.DELETE_ARTICLE){ intid=data.getIntExtra(Articles.ID,-1); aa.removeArticle(id); } } break; } } } privateclassArticleObserverextendsContentObserver{ publicArticleObserver(Handlerhandler){ super(handler); } @Override publicvoidonChange(booleanselfChange){ adapter.notifyDataSetChanged(); } } privateclassArticleAdapterextendsBaseAdapter{ privateLayoutInflaterinflater; publicArticleAdapter(Contextcontext){ inflater=LayoutInflater.from(context); } @Override publicintgetCount(){ returnaa.getArticleCount(); } @Override publicObjectgetItem(intpos){ returnaa.getArticleByPos(pos); } @Override publiclonggetItemId(intpos){ returnaa.getArticleByPos(pos).getId(); } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ Articlearticle=(Article)getItem(position); if(convertView==null){ convertView=inflater.inflate(R.layout.item,null); } TextViewtitleView=(TextView)convertView.findViewById(R.id.textview_article_title); titleView.setText("Title:"+article.getTitle()); TextViewabstractView=(TextView)convertView.findViewById(R.id.textview_article_abstract); abstractView.setText("Abstract:"+article.getAbstract()); TextViewurlView=(TextView)convertView.findViewById(R.id.textview_article_url); urlView.setText("URL:"+article.getUrl()); returnconvertView; } } } 在应用程序的主界面中,我们使用一个ListView来显示文章信息条目,这个ListView的数据源由ArticleAdapter类来提供,而ArticleAdapter类又是通过ArticlesAdapter类来获得ArticlesProvider中的文章信息的。在MainActivity的onCreate函数,我们还通过应用程序上下文的ContentResolver接口来注册了一个ArticleObserver对象来监控ArticlesProvider中的文章信息。一旦ArticlesProvider中的文章信息发生变化,就会通过ArticleAdapter类来实时更新ListView中的文章信息。 下面是ArticleActivity类的实现,它实现在src/shy/luo/article/ArticleActivity.java文件中: packageshy.luo.article; importshy.luo.providers.articles.Articles; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.View; importandroid.widget.Button; importandroid.widget.EditText; publicclassArticleActivityextendsActivityimplementsView.OnClickListener{ privatefinalstaticStringLOG_TAG="shy.luo.article.ArticleActivity"; publicfinalstaticStringEDIT_ARTICLE_ACTION="EDIT_ARTICLE_ACTION"; publicfinalstaticintMODIFY_ARTICLE=1; publicfinalstaticintDELETE_ARTICLE=2; privateintarticleId=-1; privateEditTexttitleEdit=null; privateEditTextabstractEdit=null; privateEditTexturlEdit=null; privateButtonaddButton=null; privateButtonmodifyButton=null; privateButtondeleteButton=null; privateButtoncancelButton=null; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.article); titleEdit=(EditText)findViewById(R.id.edit_article_title); abstractEdit=(EditText)findViewById(R.id.edit_article_abstract); urlEdit=(EditText)findViewById(R.id.edit_article_url); addButton=(Button)findViewById(R.id.button_add_article); addButton.setOnClickListener(this); modifyButton=(Button)findViewById(R.id.button_modify); modifyButton.setOnClickListener(this); deleteButton=(Button)findViewById(R.id.button_delete); deleteButton.setOnClickListener(this); cancelButton=(Button)findViewById(R.id.button_cancel); cancelButton.setOnClickListener(this); Intentintent=getIntent(); articleId=intent.getIntExtra(Articles.ID,-1); if(articleId!=-1){ Stringtitle=intent.getStringExtra(Articles.TITLE); titleEdit.setText(title); Stringabs=intent.getStringExtra(Articles.ABSTRACT); abstractEdit.setText(abs); Stringurl=intent.getStringExtra(Articles.URL); urlEdit.setText(url); addButton.setVisibility(View.GONE); }else{ modifyButton.setVisibility(View.GONE); deleteButton.setVisibility(View.GONE); } Log.i(LOG_TAG,"ArticleActivityCreated"); } @Override publicvoidonClick(Viewv){ if(v.equals(addButton)){ Stringtitle=titleEdit.getText().toString(); Stringabs=abstractEdit.getText().toString(); Stringurl=urlEdit.getText().toString(); Intentresult=newIntent(); result.putExtra(Articles.TITLE,title); result.putExtra(Articles.ABSTRACT,abs); result.putExtra(Articles.URL,url); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(modifyButton)){ Stringtitle=titleEdit.getText().toString(); Stringabs=abstractEdit.getText().toString(); Stringurl=urlEdit.getText().toString(); Intentresult=newIntent(); result.putExtra(Articles.ID,articleId); result.putExtra(Articles.TITLE,title); result.putExtra(Articles.ABSTRACT,abs); result.putExtra(Articles.URL,url); result.putExtra(EDIT_ARTICLE_ACTION,MODIFY_ARTICLE); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(deleteButton)){ Intentresult=newIntent(); result.putExtra(Articles.ID,articleId); result.putExtra(EDIT_ARTICLE_ACTION,DELETE_ARTICLE); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(cancelButton)){ setResult(Activity.RESULT_CANCELED,null); finish(); } } } 在ArticleActivity窗口中,我们可以执行新增、更新和删除文章信息的操作。如果启动ArticleActivity时,没有把文章ID传进来,就说明要执行操作是新增文章信息;如果启动ArticleActivity时,把文章ID和其它信自都传进来了,就说明要执行的操作是更新或者删除文章,根据用户在界面点击的是更新按钮还是删除按钮来确定。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966942,如需转载请自行联系原作者