Android使用ListView实现下拉刷新及上拉显示更多的方法
本文实例讲述了Android使用ListView实现下拉刷新及上拉显示更多的方法。分享给大家供大家参考,具体如下:
今天得需求是做listview+上下拉动在header和footer显示progressdialog,但不影响用户操作
直接上代码,我已经加上注释了,自己看。
packagecom.stay.main; importjava.net.HttpURLConnection; importjava.util.ArrayList; importjava.util.HashMap; importorg.json.JSONObject; importandroid.app.Activity; importandroid.app.ProgressDialog; importandroid.graphics.drawable.Drawable; importandroid.os.Bundle; importandroid.os.Handler; importandroid.os.HandlerThread; importandroid.os.Looper; importandroid.os.Message; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.widget.AbsListView; importandroid.widget.AbsListView.OnScrollListener; importandroid.widget.Button; importandroid.widget.LinearLayout; importandroid.widget.ListView; importandroid.widget.RelativeLayout; importandroid.widget.TextView; importcom.stay.wifi.R; /** *@authorStay *动态加载listview数据,上拉刷新,下拉更多 */ publicclassListViewActivityextendsActivityimplementsOnScrollListener{ privatestaticfinalintLOAD=0; privatestaticfinalintERROR=0; privatestaticfinalintMEMBER=1; privatestaticfinalintLOADED=2; privatestaticfinalintDIALOG=3; privatestaticfinalintFULL=4; privateNearbyAdapteradapter; privateListViewnearby_lv; privateRelativeLayoutnearby_lv_header; privateButtonlist_bottom_btn; privateLinearLayoutlist_bottom_linear; privateTextViewbottom_progress_text; privateRelativeLayoutnearby_lv_footer; privateButtonlist_header_btn; privateLinearLayoutlist_header_linear; privateTextViewheard_progress_text; privateArrayList<JSONObject>nearby_data=newArrayList<JSONObject>(); privateintlastItem; privateHashMap<String,Drawable>imageCache; privatecom.stay.main.ListViewActivity.MyHandlermyHandler; privateProgressDialogdialog; privateintcurPage=1; privatebooleanisMember=false; privateintfirstItem; publicintcount; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); myHandler.sendEmptyMessage(LOAD); } @Override publicvoidonScrollStateChanged(AbsListViewview,intscrollState){ DebugUtil.debug("onScrollStateChanged"); //当滚动停止且滚动的总数等于数据的总数,去加载 if(lastItem==count&&scrollState==SCROLL_STATE_IDLE){ DebugUtil.debug("onScrollStateChanged--------next"); if(curPage==4&&!isMember){ DebugUtil.show(this,"您不是正式会员,请申请正式会员,"); list_bottom_linear.setVisibility(View.GONE); }else{ //加载数据 myHandler.sendEmptyMessage(LOAD); } return; } //当往上拉时更新数据,将data清空然后去重新加载 if(firstItem==0&&scrollState==SCROLL_STATE_IDLE){ DebugUtil.debug("onScrollStateChanged--------refresh"); curPage=0; myHandler.sendEmptyMessage(LOAD); } } @Override publicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){ DebugUtil.debug("firstVisibleItem="+firstVisibleItem); DebugUtil.debug("visibleItemCount="+visibleItemCount); DebugUtil.debug("totalItemCount="+totalItemCount); //这里要减二,因为我加了headerfooter lastItem=firstVisibleItem+visibleItemCount-2; firstItem=firstVisibleItem; } publicintgetData(){ try{ HttpURLConnectionconn=DownloadUtil.download(url//自己写咯); ArrayList<JSONObject>temp=JSONUtil.streamToJsonList(conn.getInputStream()); if(curPage==0&&nearby_data.size()>0){ nearby_data.clear(); count=0; } if(temp!=null&&temp.size()>0){ count+=temp.size(); nearby_data.addAll(temp); DebugUtil.debug("nearby_data.size()="+nearby_data.size()); }else{ returnFULL; } returnLOADED; }catch(Exceptione){ returnERROR; } } privateHandlerhandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ super.handleMessage(msg); switch(msg.what){ caseDIALOG: list_bottom_linear.setVisibility(View.VISIBLE); list_header_linear.setVisibility(View.VISIBLE); break; caseLOADED: list_bottom_linear.setVisibility(View.GONE); list_header_linear.setVisibility(View.GONE); curPage++; adapter.notifyDataSetChanged(); break; caseERROR: DebugUtil.debug("error,missingdata"); break; caseMEMBER: DebugUtil.debug("youmustregistformalmember"); break; default: break; } } }; //创建子线程加载数据,然后更新 privateclassMyHandlerextendsHandler{ privateintstatus; publicMyHandler(Looperlooper){ super(looper); } @Override publicvoidhandleMessage(Messagemsg){ synchronized(this){ switch(msg.what){ caseLOAD://getdatafromserver handler.sendEmptyMessage(DIALOG);//显示等待框 status=getData(); handler.sendEmptyMessageDelayed(status,1000); break; default: break; } } } } publicvoidinitView(){ imageCache=newHashMap<String,Drawable>(); HandlerThreadhandlerThread=newHandlerThread("nearby"); //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start(); handlerThread.start(); myHandler=newMyHandler(handlerThread.getLooper()); nearby_lv=(ListView)findViewById(R.id.nearby_lv); nearby_lv_footer=(RelativeLayout)LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header,null); list_bottom_btn=(Button)nearby_lv_footer.findViewById(R.id.list_bottom_btn); list_bottom_linear=(LinearLayout)nearby_lv_footer.findViewById(R.id.list_bottom_linear); bottom_progress_text=(TextView)nearby_lv_footer.findViewById(R.id.progress_text); nearby_lv_header=(RelativeLayout)LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header,null); list_header_btn=(Button)nearby_lv_header.findViewById(R.id.list_bottom_btn); list_header_linear=(LinearLayout)nearby_lv_header.findViewById(R.id.list_bottom_linear); heard_progress_text=(TextView)nearby_lv_header.findViewById(R.id.progress_text); list_header_btn.setText("刷新"); list_bottom_btn.setText("更多"); list_header_linear.setVisibility(View.GONE); nearby_lv.addHeaderView(nearby_lv_header); nearby_lv.addFooterView(nearby_lv_footer); //list_header_btn.setOnClickListener(header_click); adapter=newNearbyAdapter(ListViewActivity.this,nearby_data); nearby_lv.setAdapter(adapter); nearby_lv.setOnScrollListener(ListViewActivity.this); } }
更多关于Android相关内容感兴趣的读者可查看本站专题:《AndroidService组件使用技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android操作json格式数据技巧总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。