Android ListView实现下拉加载功能
本文实例为大家分享了ListView下拉加载展示的具体代码,供大家参考,具体内容如下
1、MyListView.Java
publicclassMyListViewextendsListViewimplementsOnScrollListener{
privatefinalstaticintRELEASE_To_REFRESH=0;//下拉过程的状态值
privatefinalstaticintPULL_To_REFRESH=1;//从下拉返回到不刷新的状态值
privatefinalstaticintREFRESHING=2;//正在刷新的状态值
privatefinalstaticintDONE=3;
privatefinalstaticintLOADING=4;
//实际的padding的距离与界面上偏移距离的比例
privatefinalstaticintRATIO=3;
privateLayoutInflaterinflater;
//ListView头部下拉刷新的布局
privateLinearLayoutheaderView;
privateTextViewlvHeaderTipsTv;
privateTextViewlvHeaderLastUpdatedTv;
privateImageViewlvHeaderArrowIv;
privateProgressBarlvHeaderProgressBar;
//定义头部下拉刷新的布局的高度
privateintheaderContentHeight;
privateRotateAnimationanimation;
privateRotateAnimationreverseAnimation;
privateintstartY;
privateintstate;
privatebooleanisBack;
//用于保证startY的值在一个完整的touch事件中只被记录一次
privatebooleanisRecored;
privateOnRefreshListenerrefreshListener;
privatebooleanisRefreshable;
publicMyListView(Contextcontext){
super(context);
init(context);
}
publicMyListView(Contextcontext,AttributeSetattrs){
super(context,attrs);
init(context);
}
privatevoidinit(Contextcontext){
inflater=LayoutInflater.from(context);
headerView=(LinearLayout)inflater.inflate(R.layout.lv_header,null);
lvHeaderTipsTv=(TextView)headerView
.findViewById(R.id.lvHeaderTipsTv);
lvHeaderLastUpdatedTv=(TextView)headerView
.findViewById(R.id.lvHeaderLastUpdatedTv);
lvHeaderArrowIv=(ImageView)headerView
.findViewById(R.id.lvHeaderArrowIv);
//设置下拉刷新图标的最小高度和宽度
lvHeaderArrowIv.setMinimumWidth(70);
lvHeaderArrowIv.setMinimumHeight(50);
lvHeaderProgressBar=(ProgressBar)headerView
.findViewById(R.id.lvHeaderProgressBar);
measureView(headerView);
headerContentHeight=headerView.getMeasuredHeight();
//设置内边距,正好距离顶部为一个负的整个布局的高度,正好把头部隐藏
headerView.setPadding(0,-1*headerContentHeight,0,0);
//重绘一下
headerView.invalidate();
//将下拉刷新的布局加入ListView的顶部
addHeaderView(headerView,null,false);
//设置滚动监听事件
setOnScrollListener(this);
//设置旋转动画事件
animation=newRotateAnimation(0,-180,
RotateAnimation.RELATIVE_TO_SELF,0.5f,
RotateAnimation.RELATIVE_TO_SELF,0.5f);
animation.setInterpolator(newLinearInterpolator());
animation.setDuration(250);
animation.setFillAfter(true);
reverseAnimation=newRotateAnimation(-180,0,
RotateAnimation.RELATIVE_TO_SELF,0.5f,
RotateAnimation.RELATIVE_TO_SELF,0.5f);
reverseAnimation.setInterpolator(newLinearInterpolator());
reverseAnimation.setDuration(200);
reverseAnimation.setFillAfter(true);
//一开始的状态就是下拉刷新完的状态,所以为DONE
state=DONE;
//是否正在刷新
isRefreshable=false;
}
@Override
publicvoidonScrollStateChanged(AbsListViewview,intscrollState){
}
@Override
publicvoidonScroll(AbsListViewview,intfirstVisibleItem,
intvisibleItemCount,inttotalItemCount){
if(firstVisibleItem==0){
isRefreshable=true;
}else{
isRefreshable=false;
}
}
@Override
publicbooleanonTouchEvent(MotionEventev){
if(isRefreshable){
switch(ev.getAction()){
caseMotionEvent.ACTION_DOWN:
if(!isRecored){
isRecored=true;
startY=(int)ev.getY();//手指按下时记录当前位置
}
break;
caseMotionEvent.ACTION_UP:
if(state!=REFRESHING&&state!=LOADING){
if(state==PULL_To_REFRESH){
state=DONE;
changeHeaderViewByState();
}
if(state==RELEASE_To_REFRESH){
state=REFRESHING;
changeHeaderViewByState();
onLvRefresh();
}
}
isRecored=false;
isBack=false;
break;
caseMotionEvent.ACTION_MOVE:
inttempY=(int)ev.getY();
if(!isRecored){
isRecored=true;
startY=tempY;
}
if(state!=REFRESHING&&isRecored&&state!=LOADING){
//保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动
//可以松手去刷新了
if(state==RELEASE_To_REFRESH){
setSelection(0);
//往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步
if(((tempY-startY)/RATIO0){
state=PULL_To_REFRESH;
changeHeaderViewByState();
}
//一下子推到顶了
elseif(tempY-startY<=0){//由松开刷新状态转变到done状态
state=DONE;
changeHeaderViewByState();
}
}
//还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态
if(state==PULL_To_REFRESH){
setSelection(0);
//下拉到可以进入RELEASE_TO_REFRESH的状态
if((tempY-startY)/RATIO>=headerContentHeight){//由done或者下拉刷新状态转变到松开刷新
state=RELEASE_To_REFRESH;
isBack=true;
changeHeaderViewByState();
}
//上推到顶了
elseif(tempY-startY<=0){//由DOne或者下拉刷新状态转变到done状态
state=DONE;
changeHeaderViewByState();
}
}
//done状态下
if(state==DONE){
if(tempY-startY>0){
state=PULL_To_REFRESH;
changeHeaderViewByState();
}
}
//更新headView的size
if(state==PULL_To_REFRESH){
headerView.setPadding(0,-1*headerContentHeight
+(tempY-startY)/RATIO,0,0);
}
//更新headView的paddingTop
if(state==RELEASE_To_REFRESH){
headerView.setPadding(0,(tempY-startY)/RATIO
-headerContentHeight,0,0);
}
}
break;
default:
break;
}
}
returnsuper.onTouchEvent(ev);
}
//当状态改变时候,调用该方法,以更新界面
privatevoidchangeHeaderViewByState(){
switch(state){
caseRELEASE_To_REFRESH:
lvHeaderArrowIv.setVisibility(View.VISIBLE);
lvHeaderProgressBar.setVisibility(View.GONE);
lvHeaderTipsTv.setVisibility(View.VISIBLE);
lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);
lvHeaderArrowIv.clearAnimation();//清除动画
lvHeaderArrowIv.startAnimation(animation);//开始动画效果
lvHeaderTipsTv.setText("松开刷新");
break;
casePULL_To_REFRESH:
lvHeaderProgressBar.setVisibility(View.GONE);
lvHeaderTipsTv.setVisibility(View.VISIBLE);
lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);
lvHeaderArrowIv.clearAnimation();
lvHeaderArrowIv.setVisibility(View.VISIBLE);
//是由RELEASE_To_REFRESH状态转变来的
if(isBack){
isBack=false;
lvHeaderArrowIv.clearAnimation();
lvHeaderArrowIv.startAnimation(reverseAnimation);
lvHeaderTipsTv.setText("下拉刷新");
}else{
lvHeaderTipsTv.setText("下拉刷新");
}
break;
caseREFRESHING:
headerView.setPadding(0,0,0,0);
lvHeaderProgressBar.setVisibility(View.VISIBLE);
lvHeaderArrowIv.clearAnimation();
lvHeaderArrowIv.setVisibility(View.GONE);
lvHeaderTipsTv.setText("正在刷新...");
lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);
break;
caseDONE:
headerView.setPadding(0,-1*headerContentHeight,0,0);
lvHeaderProgressBar.setVisibility(View.GONE);
lvHeaderArrowIv.clearAnimation();
lvHeaderArrowIv.setImageResource(R.drawable.arrow);
lvHeaderTipsTv.setText("下拉刷新");
lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);
break;
}
}
//此方法直接照搬自网络上的一个下拉刷新的demo,此处是“估计”headView的width以及height
privatevoidmeasureView(Viewchild){
ViewGroup.LayoutParamsparams=child.getLayoutParams();
if(params==null){
params=newViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
intchildWidthSpec=ViewGroup.getChildMeasureSpec(0,0+0,
params.width);
intlpHeight=params.height;
intchildHeightSpec;
if(lpHeight>0){
childHeightSpec=MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
}else{
childHeightSpec=MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec,childHeightSpec);
}
publicvoidsetonRefreshListener(OnRefreshListenerrefreshListener){
this.refreshListener=refreshListener;
isRefreshable=true;
}
publicinterfaceOnRefreshListener{
publicvoidonRefresh();
}
publicvoidonRefreshComplete(){
state=DONE;
lvHeaderLastUpdatedTv.setText("最近更新:"+newDate().toLocaleString());
changeHeaderViewByState();
}
privatevoidonLvRefresh(){
if(refreshListener!=null){
refreshListener.onRefresh();
}
}
publicvoidsetAdapter(LvAdapteradapter){
lvHeaderLastUpdatedTv.setText("最近更新:"+newDate().toLocaleString());
super.setAdapter(adapter);
}
}
2、MainActivity.java
publicclassMainActivityextendsActivity{
privateListlist;
privateMyListViewlv;
privateLvAdapteradapter;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv=(MyListView)findViewById(R.id.lv);
list=newArrayList();
list.add("loonggg");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
list.add("我们都是开发者");
adapter=newLvAdapter(list,this);
lv.setAdapter(adapter);
lv.setonRefreshListener(newOnRefreshListener(){
@Override
publicvoidonRefresh(){
newAsyncTask(){
protectedVoiddoInBackground(Void...params){
try{
Thread.sleep(1000);
}catch(Exceptione){
e.printStackTrace();
}
list.add("刷新后添加的内容");
returnnull;
}
@Override
protectedvoidonPostExecute(Voidresult){
adapter.notifyDataSetChanged();
lv.onRefreshComplete();
}
}.execute(null,null,null);
}
});
}
}
3、LvAdapter
publicclassLvAdapterextendsBaseAdapter{
privateList
privateContextcontext;
publicLvAdapter(List
this.list=list;
this.context=context;
}
@Override
publicintgetCount(){
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
TextViewtv=newTextView(context.getApplicationContext());
tv.setText(list.get(position));
returntv;
}
}
4、lv_header.xml
[html]viewplaincopy
android:layout_height="wrap_content"
android:background="#000000">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="30dp">
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/arrow"/>
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下拉刷新"
android:textColor="#fff"
android:textSize="20sp"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上次更新"
android:textColor="#333"
android:textSize="10sp"/>
5、main.xml
[html]viewplaincopy
android:layout_height="fill_parent"
android:background="#000000"
android:orientation="vertical">
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。