================================= Problem description ========================== =
Import Java. text. simpledateformat; import Java. util. date; import COM. mlocso. qqtterminal. r; import android. content. context; import android. util. attributeset; import android. util. log; import android. view. layoutinflater; import android. view. motionevent; import android. view. view; import android. view. viewgroup; import android. view. animation. linearinterpolator; import android. view. animation. rotateanimation; impor T android. widget. abslistview; import android. widget. abslistview. onscrolllistener; import android. widget. baseadapter; import android. widget. imageview; import android. widget. linearlayout; import android. widget. listview; import android. widget. progressbar; import android. widget. textview; public class mylistview extends listview implements onscrolllistener {Private Static final string tag = "listview"; private Final Static int release_to_refresh = 0; private final static int pull_to_refresh = 1; private final static int refreshing = 2; private final static int done = 3; private final static int loading = 4; // ratio of actual padding distance to interface offset private final static int ratio = 3; private layoutinflater Inflater; private linearlayout headview; private textview tipstextview; private textview lastupdatedtextview; private image View arrowimageview; private progressbar; private rotateanimation animation; private rotateanimation reverseanimation; // This ensures that the value of starty is recorded only once in a complete touch event. Private int headcontentwidth; private int headcontentheight; private int starty; private int firstitemindex; private int state; private Boolean isback; private onrefreshlistener refreshlistener; private Boolean isrefres Hable; Public mylistview (context) {super (context); Init (context);} public mylistview (context, attributeset attrs) {super (context, attrs ); init (context);} private void Init (context) {// setcachecolorhint (context. getresources (). getcolor (R. color. transparent); Inflater = layoutinflater. from (context); headview = (linearlayout) Inflater. inflate (R. layout. list_head, null); arrowimageview = (Imageview) headview. findviewbyid (R. id. head_arrowimageview); arrowimageview. setminimumwidth (70); arrowimageview. setminimumheight (50); progressbar = (progressbar) headview. findviewbyid (R. id. head_progressbar); tipstextview = (textview) headview. findviewbyid (R. id. head_tipstextview); lastupdatedtextview = (textview) headview. findviewbyid (R. id. head_lastupdatedtextview); measureview (headview); headcontenthei Ght = headview. getmeasuredheight (); headcontentwidth = headview. getmeasuredwidth (); headview. setpadding (0,-1 * headcontentheight, 0, 0); headview. invalidate (); log. V ("size", "width:" + headcontentwidth + "height:" + headcontentheight); addheaderview (headview, null, false); setonscrolllistener (this ); animation = new rotateanimation (0,-180, rotateanimation. relative_to_self, 0.5f, rotateanimation. relative_t O_self, 0.5f); animation. setinterpolator (New linearinterpolator (); animation. setduration (250); animation. setfillafter (true); reverseanimation = new rotateanimation (-180, 0, rotateanimation. relative_to_self, 0.5f, rotateanimation. relative_to_self, 0.5f); reverseanimation. setinterpolator (New linearinterpolator (); reverseanimation. setduration (200); reverseanimation. setfillafter (true); State = done; isrefresha Ble = false;} public void onscroll (abslistview arg0, int firstvisiableitem, int arg2, int arg3) {firstitemindex = firstvisiableitem;} public void onscrollstatechanged (abslistview arg0, int arg1) {} public Boolean ontouchevent (motionevent event) {If (isrefreshable) {Switch (event. getaction () {Case motionevent. action_down: If (firstitemindex = 0 &&! Isrecored) {isrecored = true; starty = (INT) event. gety (); log. V (TAG, "record current position when down '");} break; Case motionevent. action_up: If (State! = Refreshing & state! = Loading) {If (State = done) {// nothing else} If (State = pull_to_refresh) {state = done; changeheaderviewbystate (); log. V (TAG, "Refresh from drop-down to done status");} If (State = release_to_refresh) {state = refreshing; changeheaderviewbystate (); onrefresh (); log. V (TAG, "from release refresh status to done status") ;}} isrecored = false; isback = false; break; Case motionevent. action_move: int Tempy = (INT) event. gety (); If (! Isrecored & firstitemindex = 0) {log. V (TAG, "record location when moving"); isrecored = true; starty = Tempy;} If (State! = Refreshing & isrecored & state! = Loading) {// ensure that the current position is always in the head during the padding setting process. Otherwise, if the list exceeds the screen, when pushing, the list will scroll at the same time. // you can easily refresh the IF (State = release_to_refresh) {setselection (0); // push up to the extent that the screen is sufficient to cover up the head, however, it has not been pushed to the full-covered level. If (Tempy-starty)/ratio 0) {state = pull_to_refresh; changeheaderviewbystate (); log. V (TAG, "changed from release refresh status to pull-down refresh status");} // pushed to the top of else if (Tempy-starty <= 0) {state = done; changeheader Viewbystate (); log. V (TAG, "changed from release refresh status to done status");} // pull down, or the head has not been pushed up to the top of the screen. else {// no special operation is required, you only need to update the paddingtop value.} // The status of done or pull_to_refresh if (State = pull_to_refresh) {setselection (0) is not displayed yet ); // drop-down to the status if (Tempy-starty)/ratio> = headcontentheight) {state = release_to_refresh; isback = true; changeheaderviewbystate (); log. V (TAG, "changed from done or pull-down refresh status to release refresh");} // push to the top of El Se if (Tempy-starty <= 0) {state = done; changeheaderviewbystate (); log. V (TAG, "changed from done or pull-down refresh status to done status"); }}// if (State = done) in done status) {If (Tempy-starty> 0) {state = pull_to_refresh; changeheaderviewbystate () ;}// update the sizeif (State = pull_to_refresh) of headview {headview. setpadding (0,-1 * headcontentheight + (Tempy-starty)/ratio, 0, 0);} // update the paddingtopif (State = release_to_refresh) of headview) {Headview. setpadding (0, (Tempy-starty)/ratio-headcontentheight, 0, 0) ;}} break ;}} return Super. ontouchevent (event);} // call this method when the status changes to update the private void changeheaderviewbystate () {Switch (state) {Case release_to_refresh: arrowimageview. setvisibility (view. visible); progressbar. setvisibility (view. gone); tipstextview. setvisibility (view. visible); lastupdatedtextview. setvisibility (view. visible); arrowimage View. clearanimation (); arrowimageview. startanimation (animation); tipstextview. settext ("Release and refresh"); log. V (TAG, "Current Status, release refresh"); break; Case pull_to_refresh: progressbar. setvisibility (view. gone); tipstextview. setvisibility (view. visible); lastupdatedtextview. setvisibility (view. visible); arrowimageview. clearanimation (); arrowimageview. setvisibility (view. visible); // If (isback) {isback = false, Which is changed from release_to_refresh status; Arrowimageview. clearanimation (); arrowimageview. startanimation (reverseanimation); tipstextview. settext ("pull-down refresh");} else {tipstextview. settext ("pull-down refresh");} log. V (TAG, "Current Status, pull-down refresh"); break; Case refreshing: headview. setpadding (0, 0, 0, 0); progressbar. setvisibility (view. visible); arrowimageview. clearanimation (); arrowimageview. setvisibility (view. gone); tipstextview. settext ("refreshing... "); lastupdatedtextview. setvisibil Ity (view. visible); log. V (TAG, "Current Status, refreshing... "); break; Case done: headview. setpadding (0,-1 * headcontentheight, 0, 0); progressbar. setvisibility (view. gone); arrowimageview. clearanimation (); arrowimageview. setimageresource (R. drawable. arrow_down); tipstextview. settext ("pull-down refresh"); lastupdatedtextview. setvisibility (view. visible); log. V (TAG, "Current Status, done"); break ;}} public void setonrefreshlistener (onrefreshlistener re Freshlistener) {This. refreshlistener = refreshlistener; isrefreshable = true;} public interface onrefreshlistener {public void onrefresh ();} public void onrefreshcomplete () {state = done; simpledateformat format = new simpledateformat ("YYYY mm dd hh: mm"); string date = format. format (new date (); lastupdatedtextview. settext (date); changeheaderviewbystate ();} private void onrefresh () {If (refreshlistener! = NULL) {refreshlistener. onrefresh () ;}}// this method is directly copied from a drop-down refresh demo on the network. Here, we estimate the width of headview and heightprivate void measureview (view child) {viewgroup. layoutparams P = child. getlayoutparams (); If (P = NULL) {P = new viewgroup. layoutparams (viewgroup. layoutparams. fill_parent, viewgroup. layoutparams. wrap_content);} int childwidthspec = viewgroup. getchildmeasurespec (0, 0 + 0, P. width); int lpheight = P. height; int childheightspec; If (lpheight> 0) {childheightspec = measurespec. makemeasurespec (lpheight, measurespec. exactly);} else {childheightspec = measurespec. makemeasurespec (0, measurespec. unspecified);} child. measure (childwidthspec, childheightspec);} public void setadapter (baseadapter adapter) {simpledateformat format = new simpledateformat ("YYYY mm dd hh: mm"); string date = format. format (new date (); lastupdatedtextview. settext (date); super. setadapter (adapter) ;}}
=============================== Solution 1 ========================== ===
I helped you study it last time. It seems that there is no problem. Have you changed the pull library ,,,
top the listview drop-down list and pull it up normally. Please take a look.