Android中ListView動態載入數據
1. 引言:
為了提高ListView的效率和應用程序的性能,在Android應用程序中不應該一次性載入ListView所要顯示的全部信息,而是採取分批載入策略,隨著用戶的滑動,動態的從後臺載入所需的數據,並渲染到ListView組件中,這樣可以極大的改善應用程序的性能和用戶體驗。2. 交互:
進入ListView組件,首先預載入N條記錄,當用戶滑動到最後一條記錄顯示載入提示信息,並從後臺載入N條數據,接著渲染UI界面。3. 效果圖:
4. 程序實現: view plaincopy to clipboard
- packagecom.focus.loading;
- importandroid.app.ListActivity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.AbsListView;
- importandroid.widget.BaseAdapter;
- importandroid.widget.LinearLayout;
- importandroid.widget.ListView;
- importandroid.widget.ProgressBar;
- importandroid.widget.TextView;
- importandroid.widget.AbsListView.OnScrollListener;
- importandroid.widget.LinearLayout.LayoutParams;
- publicclassListViewLoadingActivityextendsListActivityimplements
- OnScrollListener{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- /**
- *"載入項"佈局,此佈局被添加到ListView的Footer中。
- */
- mLoadLayout=newLinearLayout(this);
- mLoadLayout.setMinimumHeight(60);
- mLoadLayout.setGravity(Gravity.CENTER);
- mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
- /**
- *向"載入項"佈局中添加一個圓型進度條。
- */
- ProgressBarmProgressBar=newProgressBar(this);
- mProgressBar.setPadding(0,0,15,0);
- mLoadLayout.addView(mProgressBar,mProgressBarLayoutParams);
- /**
- *向"載入項"佈局中添加提示信息。
- */
- TextViewmTipContent=newTextView(this);
- mTipContent.setText("載入中...");
- mLoadLayout.addView(mTipContent,mTipContentLayoutParams);
- /**
- *獲取ListView組件,並將"載入項"佈局添加到ListView組件的Footer中。
- */
- mListView=getListView();
- mListView.addFooterView(mLoadLayout);
- /**
- *組ListView組件設置Adapter,並設置滑動監聽事件。
- */
- setListAdapter(mListViewAdapter);
- mListView.setOnScrollListener(this);
- }
- publicvoidonScroll(AbsListViewview,intmFirstVisibleItem,
- intmVisibleItemCount,intmTotalItemCount){
- mLastItem=mFirstVisibleItem+mVisibleItemCount-1;
- if(mListViewAdapter.count>mCount){
- mListView.removeFooterView(mLoadLayout);
- }
- }
- publicvoidonScrollStateChanged(AbsListViewview,intmScrollState){
- /**
- *當ListView滑動到最後一條記錄時這時,我們會看到已經被添加到ListView的"載入項"佈局,這時應該載入剩餘數據。
- */
- if(mLastItem==mListViewAdapter.count
- &&mScrollState==OnScrollListener.SCROLL_STATE_IDLE){
- if(mListViewAdapter.count<=mCount){
- mHandler.postDelayed(newRunnable(){
- @Override
- publicvoidrun(){
- mListViewAdapter.count+=10;
- mListViewAdapter.notifyDataSetChanged();
- mListView.setSelection(mLastItem);
- }
- },1000);
- }
- }
- }
- classListViewAdapterextendsBaseAdapter{
- intcount=10;
- publicintgetCount(){
- returncount;
- }
- publicObjectgetItem(intposition){
- returnposition;
- }
- publiclonggetItemId(intposition){
- returnposition;
- }
- publicViewgetView(intposition,Viewview,ViewGroupparent){
- TextViewmTextView;
- if(view==null){
- mTextView=newTextView(ListViewLoadingActivity.this);
- }else{
- mTextView=(TextView)view;
- }
- mTextView.setText("Item"+position);
- mTextView.setTextSize(20f);
- mTextView.setGravity(Gravity.CENTER);
- mTextView.setHeight(60);
- returnmTextView;
- }
- }
- privateLinearLayoutmLoadLayout;
- privateListViewmListView;
- privateListViewAdaptermListViewAdapter=newListViewAdapter();
- privateintmLastItem=0;
- privateintmCount=41;
- privatefinalHandlermHandler=newHandler();
- privatefinalLayoutParamsmProgressBarLayoutParams=newLinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- privatefinalLayoutParamsmTipContentLayoutParams=newLinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- }
推薦閱讀: