Android中ListView动态加载数据 加载中
16lz
2021-01-26
1. 引言:
为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。
2. 交互:
进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。
3. 效果图:
4. 程序实现:
- 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);
- }
更多相关文章
- Android触摸滑动全解(三)——View坐标体系详解
- webView程序 第一次加载页面是出现白屏或是黑屏或是其他
- Android艺术开发探索第三章————View的事件体系(下)
- 【Android(安卓)如何置底一个View(附 前置声明layout布局文件中的
- android 群英传笔记----Android(安卓)scroll
- Android中so使用知识和问题总结以及插件开发过程中加载so的方案
- Android(安卓)修改字体,跳不过的 Typeface
- Android动态加载技术 简单易懂的介绍方式
- (4.2.2.2)【android开源工具】【Android(安卓)UI设计与开发】第17