1. Add load more layouts
1_ Initialize and Hide code
Called in the Refreshlistview constructor method
private void Initfooterview {
View Footerview = view.inflate (Context, R.layout.refresh_listview_ footer, null);
Hidden code
footerview.measure (0, 0);
int footerviewheight = Footerview.getmeasuredheight ();
Footerview.setpadding (0,-footerviewheight, 0, 0);
This.addfooterview (Footerview);
}
2_ Layout File Refresh_listview_footer.xml
<?xml version= "1.0" encoding= "Utf-8"?> <linearlayout xmlns:android=
"http://schemas.android.com/apk/" Res/android "
android:layout_width=" match_parent "
android:layout_height=" Wrap_content "
android: gravity= "center"
android:orientation= "Horizontal" >
<progressbar
android:layout_margin= "5dip"
android:layout_width= "wrap_content"
android:layout_height= "Wrap_content"
android: indeterminatedrawable= "@drawable/custom_progressbar"/>
<textview
android:layout_marginleft= " 10dip "
android:layout_width=" wrap_content "
android:layout_height=" wrap_content "
android:text=" Load more ... "
android:textcolor=" #ff0000 "android:textsize=" "
25sp"/>
</LinearLayout>
2. Drag to the bottom of the time
/** * Menu Page corresponding to the News page sign page * Total 12 * @author Administrator */public class Tabmenudetailpager extends Menudetailbasepagerimpl
Ements Onpagechangelistener {/** * News center-News menu corresponding to the label corresponding to the data/private Newcentertag Newcentertag; .../**......
* URL to load more data/private String moreurl;
/** * Whether to load more data */protected Boolean isloadingmore = false; ... @Override public view Initview () {View view = View.inflate (mactivity, r.layout.tab_detail, NULL);//Put on a set of
View into the Xutils frame viewutils.inject (this, view); ...//Set listening Drop-down refresh Mlistview.setonrefreshlistener (new Onrefreshlistener () {@Override public void). \ \ \ \ \ \ \ \ \ \ Onpulldownrefresh () {ispulldownrefreshing = true; Getdatafromnet ();} @Override public void Onloadingmore () {if (textutil S.isempty (Moreurl)) {Toast.maketext (mactivity, "No More Data", 1). Show (); Mlistview.onrefreshfinish (false);
else{//Have more data to load more data getmoredatafromnet ();}
});
return view; /** * Load More Data * * protected void getmoredatafromnet () {httputils httputils= new Httputils (); Httputils.send (Httpmethod.get, Moreurl, New requestcallback<string> () {@Override public void onsuccess (
Responseinfo<string> responseinfo) {System.out.println ("Load more data successfully:" +responseinfo.result);
Mlistview.onrefreshfinish (FALSE);
Isloadingmore = true;
ProcessData (Responseinfo.result);
@Override public void OnFailure (httpexception error, String msg) {Mlistview.onrefreshfinish (false);
SYSTEM.OUT.PRINTLN ("Load more data failed:" + msg);
}
}); /** * Process and parse JSON data * @param JSON/protected void ProcessData (String json) {Tabdetailbean bean = Parserjson (JSON); if (!
Isloadingmore) {System.out.println (bean.data.news.get (0). title); topnews = bean.data.topnews;//set adapter for Viewpager
Tabdetailadapter adapter = new Tabdetailadapter ();
Mviewpager.setadapter (adapter);
Remove all view ll_point_group.removeallviews ();
for (int i=0;i<topnews.size (), i++) {View point = new View (mactivity);
Layoutparams params = new Layoutparams (5, 5); Point.setbackgroundresource (R.drawable.tab_detail_poinT_BG);
if (i!=0) {params.leftmargin =;} point.setenabled (false);
Point.setlayoutparams (params);
Ll_point_group.addview (point);
} previouspointposition = 0;
Sets the default picture description and indicator point Mtv_title_description.settext (Topnews.get (previouspointposition). title);
Ll_point_group.getchildat (previouspointposition). SetEnabled (True);
Set up a page change listening mviewpager.setonpagechangelistener (this);
Set the adapter and corresponding data newslists = Bean.data.news;
Listviewadapter = new Listviewadapter ();
Mlistview.setadapter (Listviewadapter);
Mlistview.addheaderview (v);//Add a view to the ListView}else{///Get the list news out, in the previous collection, in the Refresh data Isloadingmore = false;
List<news>moredatanews = Bean.data.news;
Newslists.addall (moredatanews); Listviewadapter.notifydatasetchanged ()///Refresh Data}} .../** * Parse json with Gson Open source project * @param JSON * * and private Tabdetai
Lbean Parserjson (String json) {Gson Gson = new Gson ();
Tabdetailbean bean = Gson.fromjson (JSON, tabdetailbean.class);
Moreurl = Bean.data.more;
if (Textutils.isempty (Moreurl)) {moreurl = null;}else{moreurl = Constantutils.server_url+moreurl;} return bean; @Override public void onpagescrollstatechanged (int arg0) {//TODO auto-generated method stub} @Override public void on pagescrolled (int arg0, float arg1, int arg2) {//TODO auto-generated Method stub} ...}..
3. Full code
Package Com.atguigu.refreshlistview;
Import Android.content.Context;
Import Android.util.AttributeSet;
Import android.view.MotionEvent;
Import Android.view.View;
Import android.view.animation.Animation;
Import android.view.animation.RotateAnimation;
Import Android.widget.AbsListView;
Import Android.widget.ImageView;
Import Android.widget.LinearLayout;
Import Android.widget.ListView;
Import Android.widget.ProgressBar;
Import Android.widget.TextView;
Import Java.text.SimpleDateFormat;
Import Java.util.Date; /** * Role: Custom Drop-down refreshed ListView/public class Refreshlistview extends ListView {/** * dropdown refresh and top Carousel map * * Private linearlayout Head
Erview;
/** * Drop-down Refresh control/private View Ll_pull_down_refresh;
Private ImageView Iv_arrow;
Private ProgressBar Pb_status;
Private TextView Tv_status;
Private TextView Tv_time;
/** * Drop-down Refresh control high/private int pulldownrefreshheight;
/** * Drop-down Refresh * * public static final int pull_down_refresh = 0;
/** * slackened Refresh * * public static final int release_refresh = 1; /** * is refreshing/publicstatic final int refreshing = 2;
/** * Current state */private int currentstatus = Pull_down_refresh;
Private Animation upanimation;
Private Animation downanimation;
/** * Load More controls/private View Footerview;
/** * Load More Controls High * * Private int footerviewheight;
/** * Whether it has loaded more * * Private Boolean isloadmore = false;
/** * The top part of the Carousel map part * * Private View Topnewsview;
/** * ListView The coordinates on the y-axis/private int listviewonscreeny =-1; Public Refreshlistview {This (context, null);} public Refreshlistview, AttributeSet att RS) {This [context, attrs, 0];} public Refreshlistview (context, AttributeSet attrs, int defstyleattr) {super (con
Text, Attrs, defstyleattr);
Initheaderview (context);
Initanimation ();
Initfooterview (context); } private void Initfooterview {Footerview = view.inflate (context, r.layout.refresh_footer, null); Foote
Rview.measure (0, 0);
Footerviewheight = Footerview.getmeasuredheight ();
Footerview.setpadding (0,-footerviewheight, 0, 0); ListView Add FOoter Addfooterview (Footerview);
Monitor the ListView scrolling Setonscrolllistener (New Myonscrolllistener ()); /** * Add top Carousel Figure * @param topnewsview/public void Addtopnewsview (View topnewsview) {if (Topnewsview!= null) {This.topne
Wsview =topnewsview;
Headerview.addview (Topnewsview); Class Myonscrolllistener implements onscrolllistener{@Override public void onscrollstatechanged (Abslistview view, in T scrollstate) {///when the static or inertia is rolling the if (Scrollstate ==onscrolllistener.scroll_state_idle| | Scrollstate ==onscrolllistener.scroll_state_fling) {//and is the last visible if (Getlastvisibleposition () >=getcount ()-1) {//
1. Display load more layout footerview.setpadding (8,8,8,8);
2. state change Isloadmore = true;
3. Callback interface if (Monrefreshlistener!= null) {Monrefreshlistener.onloadmore ();}}
@Override public void Onscroll (Abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) {}} private void Initanimation () {upanimation = new Rotateanimation (0, -180, rotateanimation.relative_to_self, 0.5f, Rotatea Nimation. RelativE_to_self, 0.5f);
Upanimation.setduration (500);
Upanimation.setfillafter (TRUE); Downanimation = new Rotateanimation ( -180, -360, Rotateanimation.relative_to_self, 0.5f, rotateanimation.relative_to_
SELF, 0.5f);
Downanimation.setduration (500);
Downanimation.setfillafter (TRUE); } private void Initheaderview {Headerview = (linearlayout) view.inflate (context, R.layout.refresh_
header, NULL);
Drop-down Refresh Control Ll_pull_down_refresh = Headerview.findviewbyid (R.id.ll_pull_down_refresh);
Iv_arrow = (ImageView) Headerview.findviewbyid (R.id.iv_arrow);
Pb_status = (ProgressBar) Headerview.findviewbyid (r.id.pb_status);
Tv_status = (TextView) Headerview.findviewbyid (r.id.tv_status);
Tv_time = (TextView) Headerview.findviewbyid (r.id.tv_time);
Measuring ll_pull_down_refresh.measure (0, 0);
Pulldownrefreshheight = Ll_pull_down_refresh.getmeasuredheight (); Default hidden Drop-down Refresh control//view.setpadding (0,-control High, 0,0);//completely hide//view.setpadding (0, 0,0,0);//Full display Ll_pull_down_ Refresh.setpadding (0,-pulldownrefreshheight, 0, 0);
Add ListView Head Addheaderview (Headerview);
Private float starty =-1; @Override public boolean ontouchevent (motionevent ev) {switch (ev.getaction ()) {case Motionevent.action_down://1. Record start sitting
Standard starty = Ev.gety ();
Break Case MotionEvent.ACTION_MOVE:if (Starty = = 1) {starty = Ev.gety ();}//To determine if the top carousel is fully displayed, only full display will have a drop-down refresh Boolean isdisplaytop
News = Isdisplaytopnews (); if (!isdisplaytopnews) {//load more break;}//If it is being refreshed, do not let it refresh the if (currentstatus = = refreshing) {breaking; to the new coordinates float EndY
= Ev.gety ();
3. Record sliding distance float Distancey = endy-starty; if (Distancey > 0) {//dropdown//int paddingtop =-control high + distancey; int paddingtop = (int) (-pulldownrefreshheight + distance
Y);
if (Paddingtop < 0 && currentstatus!= pull_down_refresh) {//dropdown refresh Status Currentstatus = Pull_down_refresh;//Update status
Refreshviewstate (); else if (paddingtop > 0 && currentstatus!= release_refresh) {//slackened refresh status Currentstatus = Release_refresh;//update
State refreshviewstate (); } ll_pull_down_refresh.setpadding(0, paddingtop, 0, 0);
View.setpadding (0,paddingtop,0,0);//dynamic Display Drop-down refresh control} break;
Case MotionEvent.ACTION_UP:startY =-1; if (Currentstatus = = Pull_down_refresh) {//view.setpadding (0,-control High, 0,0);//Full Hide ll_pull_down_refresh.setpadding (0,-
Pulldownrefreshheight, 0, 0); else if (currentstatus = = Release_refresh) {//setting state is refreshing currentstatus = refreshing; refreshviewstate ();//View.setpadd
ING (0,0,0,0);//full display ll_pull_down_refresh.setpadding (0, 0, 0, 0);
Callback interface if (Monrefreshlistener!= null) {Monrefreshlistener.onpulldownrefresh ();}}
Break
return super.ontouchevent (EV);
/** * To determine if the top carousel is fully displayed * when the ListView on the screen is less than or equal to the coordinates of the top carousel in the Y axis, the top carousel map is fully displayed * @return/private Boolean isdisplaytopnews () { if (Topnewsview!= null) {//1. Get ListView coordinates on screen int[] location = new Int[2]; if (Listviewonscreeny = 1) {GETLOCATIONONSCR
Een (location);
Listviewonscreeny = location[1];
//2. Get the top carousel graph on the screen coordinates topnewsview.getlocationonscreen (location);
int topnewsviewonscreeny = location[1]; if (Listviewonscreeny <= topnewsviewonscreeny) {//return true;//}else{//return false;//} return Listviewonscreeny <= Topnewsviewon
ScreenY;
}else{return true;}} private void Refreshviewstate () {switch (currentstatus) {case pull_down_refresh://Drop-down refresh State iv_arrow.startanimation (
Downanimation);
Tv_status.settext ("Drop-down refresh ...");
Break
Case release_refresh://slackened Refresh Status iv_arrow.startanimation (Upanimation);
Tv_status.settext ("slackened refresh ...");
Break
Case refreshing://is refreshing state tv_status.settext ("refreshing ...");
Pb_status.setvisibility (VISIBLE);
Iv_arrow.clearanimation ();
Iv_arrow.setvisibility (GONE);
Break
}/** * Callback This method when networking succeeds and fails * User Refresh status Restore * * @param sucess/public void Onrefreshfinish (Boolean sucess) {if (Isloadmore) {
Load more isloadmore = false;
Hide load More layout footerview.setpadding (0,-footerviewheight,0,0);
}else{//Dropdown refresh Tv_status.settext ("dropdown refresh ...");
Currentstatus = Pull_down_refresh;
Iv_arrow.clearanimation ();
Pb_status.setvisibility (GONE);
Iv_arrow.setvisibility (VISIBLE); Hide Drop-down Refresh Control Ll_pull_down_refresh.setpaddinG (0,-pulldownrefreshheight, 0, 0);
if (sucess) {//Set the latest update time Tv_time.settext (last updated: + GetSystemTime ());} /** * Get current Android system time * * @return/private String GetSystemTime () {SimpleDateFormat format = new SimpleDateFormat ("Y
Yyy-mm-dd HH:mm:ss ");
Return Format.format (New Date ()); /** * The refresh of the listener control/public interface Onrefreshlistener {/** * This method is recalled when the current pull is refreshed * * public void Onpulldownrefresh ();/** when loading more
When the callback this method * * public void onloadmore ();
Private Onrefreshlistener Monrefreshlistener; /** * Set listener refresh, set by the outside * * public void Setonrefreshlistener (Onrefreshlistener l) {this.monrefreshlistener = l;}}
The above is a small set to introduce the Android imitation Silicon Valley News Drop-down Refresh/Pull load more, I hope to help you, if you have any questions please give me a message, small series will promptly reply to everyone. Here also thank you very much for the cloud Habitat Community website support!