需求:項目中的消息列表界面要求實現類似sina微博的下拉刷新;
思路:一般的消息列表為ListView類型,將list加載到adapter中,再將adapter加載到ListView中,從而實現消息列表的展示。而下拉刷新要求給消息列表加一個頭部,其中有圖片(向上/向下箭頭)和提示字樣(下拉刷新/松開刷新),從而我們需要做的事情:1.需要做一個head.xm來實現頭部的樣式定義;2.需要自定義一個繼承了ListView的MsgListView,在該類中將head加在MsgListView對象的頭部;3.將原有的消息界面布局文件中的ListView改為cn.xd.microblogging.tools.MsgListView(包名.MsgListView);4.將原有的消息界面後台代碼中創建的ListView對象改為MsgListView對象,注意消息界面Activity要繼承ListActivity,並且實現其刷新監聽。
說明:實現下拉刷新很簡單,僅需要4個文件:MsgRcvListActivity.java(消息列表界面的後台文件,真正的刷新動作在這裡完成,下拉刷新相關code下面列出),msgrcvlistactivity.xml(消息列表界面的前台文件,下拉刷新相關code下面列出),MsgListView.java(本文件拿來主義即可不用改,下拉刷新自定義的列表類,監聽並執行下拉刷新、松開刷新、正在刷新、完成刷新等狀態的改變,但真正的刷新動作不在這裡完成,完整code下面列出),head.xml(本文件拿來主義即可不用改,下拉刷新的樣式定義文件,包括向上、向下箭頭,刷新狀態提示等,完整code下面列出);
效果:
代碼:
1.MsgRcvListActivity.java :
- publicclass MsgRcvListActivity extends ListActivity {//注意:要繼承ListActivity
- …………//變量定義,略
- MsgListView list;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.msgrcvlistactivity);
- list=(MsgListView)findViewById(Android.R.id.list);//繼承ListActivity,id要寫成android.R.id.list,否則報異常
- …………//其他代碼,略
- //刷新監聽,此處實現真正刷新
- list.setonRefreshListener(new OnRefreshListener() {
- publicvoid onRefresh() {
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... params) {
- try {
- Thread.sleep(1000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- returnnull;
- }
- @Override
- protectedvoid onPostExecute(Void result) {
- adapter.notifyDataSetChanged();
- new MsgLoad().execute();//刷新監聽中,真正執行刷新動作
- list.onRefreshComplete();
- }
- }.execute(null);
- }
- });
- list.setItemsCanFocus(false);
- list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- }
- …………//其他代碼,略
- publicclass MsgLoad extends AsyncTask<Void, Void, List<MsgBean>> {
- …………//其他代碼,略
- }
- }
- publicclass MsgRcvListActivity extends ListActivity {//注意:要繼承ListActivity
- …………//變量定義,略
- MsgListView list;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.msgrcvlistactivity);
- list=(MsgListView)findViewById(android.R.id.list);//繼承ListActivity,id要寫成android.R.id.list,否則報異常
- …………//其他代碼,略
- //刷新監聽,此處實現真正刷新
- list.setonRefreshListener(new OnRefreshListener() {
- publicvoid onRefresh() {
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... params) {
- try {
- Thread.sleep(1000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- returnnull;
- }
- @Override
- protectedvoid onPostExecute(Void result) {
- adapter.notifyDataSetChanged();
- new MsgLoad().execute();//刷新監聽中,真正執行刷新動作
- list.onRefreshComplete();
- }
- }.execute(null);
- }
- });
- list.setItemsCanFocus(false);
- list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- }
- …………//其他代碼,略
- publicclass MsgLoad extends AsyncTask<Void, Void, List<MsgBean>> {
- …………//其他代碼,略
- }
- }