Android Imitation Silicon Valley News dropdown refresh/pull load more _android

Source: Internet
Author: User
Tags gety stub

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!

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.