Android自定义listview布局实现上拉加载下拉刷新功能

Android自定义listview布局实现上拉加载下拉刷新功能,第1张

概述listview实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义布局,复用性也比较的强。首先就是继承的listview的自定义view。

ListvIEw实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义的布局,复用性也比较的强。首先就是继承的ListvIEw的自定义view。

     autoListVIEw.Java:

package com.example.mic.testdemo.vIEw; import androID.annotation.TargetAPI; import androID.content.Context; import androID.os.Build; import androID.os.Bundle; 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.Animation; import androID.vIEw.animation.linearInterpolator; import androID.vIEw.animation.RotateAnimation; import androID.Widget.AbsListVIEw; import androID.Widget.ImageVIEw; import androID.Widget.ListVIEw; import androID.Widget.Progressbar; import androID.Widget.TextVIEw; import com.example.mic.testdemo.R; import java.text.SimpleDateFormat; /**  * Created by DFLENOVO on 2016/8/3.  */ public class autoListVIEw extends ListVIEw implements AbsListVIEw.OnScrollListener {   public static final String FOOTER = "FOOTER";   public static final String header = "header";   private static final int PulL = 1;   private static final int NONE = 0;   //  private static final int RELEASE = 2;   private static final int REFRESHING = 2;   private static final int SPACE = 20;   private static final String TAG = "autoListVIEw";   private RotateAnimation downAnimation;   private RotateAnimation upAnimation;   private Context context;   private LayoutInflater inflater;   private VIEw footer;   private VIEw header;   private int headerContentinitialHeight;   private int headerContentHeight;   private OnRefreshListener onRefreshListener;   private boolean loadEnable;   private OnLoadListener onLoadListener;   private int firstVisibleItem;   private boolean isLoadingMore = false;   private int startY;   private int state;   private ImageVIEw iv_pull;   private int footerVIEwHeight;   private Progressbar mProgressbar;   private TextVIEw tvstate;   private TextVIEw tvLastUpdateTime;   private boolean isScrollToBottom;   public autoListVIEw(Context context) {     super(context);     initVIEw(context);   }   public autoListVIEw(Context context,AttributeSet attrs) {     super(context,attrs);     initVIEw(context);   }   public autoListVIEw(Context context,AttributeSet attrs,int defStyleAttr) {     super(context,attrs,defStyleAttr);     initVIEw(context);   }   @TargetAPI(Build.VERSION_CODES.LolliPOP)   public autoListVIEw(Context context,int defStyleAttr,int defStyleRes) {     super(context,defStyleAttr,defStyleRes);     initVIEw(context);   }   private voID initVIEw(Context context) {     initheaderVIEw();     initFooterVIEw();     this.setonScrollListener(this); //   }   private voID initheaderVIEw() {     header = VIEw.inflate(getContext(),R.layout.pull_to_refresh_header,null);     iv_pull = (ImageVIEw) header         .findVIEwByID(R.ID.iv_pull);     mProgressbar = (Progressbar) header         .findVIEwByID(R.ID.pb_ListvIEw_header);     tvstate = (TextVIEw) header         .findVIEwByID(R.ID.tv_ListvIEw_header_state);     tvLastUpdateTime = (TextVIEw) header         .findVIEwByID(R.ID.tv_ListvIEw_header_last_update_time);     // 设置最后刷新时间     tvLastUpdateTime.setText("最后刷新时间: " + getLastUpdateTime());     header.measure(0,0); // 系统会帮我们测量出headerVIEw的高度     headerContentHeight = header.getMeasuredHeight();     header.setpadding(0,-headerContentHeight,0);     this.addheaderVIEw(header,header,true); // 向ListVIEw的顶部添加一个vIEw对象     initAnimation();   }   private voID initAnimation() {     upAnimation = new RotateAnimation(0f,-180f,Animation.relative_TO_SELF,0.5f,0.5f);     upAnimation.setDuration(500);     upAnimation.setFillAfter(true); // 动画结束后,停留在结束的位置上     downAnimation = new RotateAnimation(-180f,-360f,0.5f);     downAnimation.setDuration(500);     downAnimation.setFillAfter(true); // 动画结束后,停留在结束的位置上   }   private String getLastUpdateTime() {     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     return sdf.format(System.currentTimeMillis());   }   private voID initFooterVIEw() {     footer = VIEw.inflate(getContext(),R.layout.foot_vIEw,null);     footer.measure(0,0);     footerVIEwHeight = footer.getMeasuredHeight();     footer.setpadding(0,-footerVIEwHeight,0);     this.addFooterVIEw(footer,FOOTER,true);   }   private voID measureVIEw(VIEw child) {     VIEwGroup.LayoutParams p = child.getLayoutParams();     if (p == null) {       p = new VIEwGroup.LayoutParams(VIEwGroup.LayoutParams.MATCH_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);//得到的是size。     } else {       childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UnspecIFIED);//得到的是子布局的实际大小。     }     child.measure(chilDWIDthSpec,childHeightSpec);   }   private voID toppadding(int toppadding) {     header.setpadding(header.getpaddingleft(),toppadding,header.getpaddingRight(),header.getpaddingBottom());     header.invalIDate();   }   @OverrIDe   public voID onScrollStateChanged(AbsListVIEw absListVIEw,int i) {     if (i == SCRolL_STATE_IDLE         || i == SCRolL_STATE_FliNG) {       // 判断当前是否已经到了底部       if (isScrollToBottom && !isLoadingMore) {         isLoadingMore = true;         // 当前到底部         Log.i(TAG,"加载更多数据");         footer.setpadding(0,0);         this.setSelection(this.getCount());         if (onLoadListener != null) {           onLoadListener.onLoad();         }       }     }   }   @OverrIDe   public voID onScroll(AbsListVIEw absListVIEw,int i,int i1,int i2) {     this.firstVisibleItem = i;     if (getLastVisibleposition() == (i2 - 1)) {       isScrollToBottom = true;     } else {       isScrollToBottom = false;     }   }   @OverrIDe   public boolean ontouchEvent(MotionEvent ev) {     switch (ev.getAction()) { //       case MotionEvent.ACTION_DOWN:         startY = (int) ev.getY();         break;       case MotionEvent.ACTION_MOVE:         int moveY = (int) ev.getY();         // 移动中的y - 按下的y = 间距.         int diff = (moveY - startY) / 2;         // -头布局的高度 + 间距 = paddingtop         int paddingtop = -headerContentHeight + diff;         // 如果: -头布局的高度 > paddingtop的值 执行super.ontouchEvent(ev);         if (firstVisibleItem == 0             && -headerContentHeight < paddingtop) {           if (paddingtop > 0 && state == NONE) { // 完全显示了.             Log.i(TAG,"松开刷新");             state = PulL;             refreshheaderVIEwByState();           } else if (paddingtop < 0               && state == PulL) { // 没有显示完全             Log.i(TAG,"下拉刷新");             state = NONE;             refreshheaderVIEwByState();           }           // 下拉头布局           header.setpadding(0,paddingtop,0);         }         break;       case MotionEvent.ACTION_UP:         // 判断当前的状态是松开刷新还是下拉刷新         if (state == PulL) {           Log.i(TAG,"刷新数据.");           // 把头布局设置为完全显示状态           header.setpadding(0,0);           // 进入到正在刷新中状态           state = REFRESHING;           refreshheaderVIEwByState();           if (onRefreshListener != null) {             onRefreshListener.onRefresh(); // 调用使用者的监听方法           }         } else if (state == NONE) {           // 隐藏头布局           header.setpadding(0,0);         }         break;       default:         break;     }     return super.ontouchEvent(ev);   } //   private voID refreshheaderVIEwByState() {     switch (state) { //       case NONE: // 下拉刷新状态         tvstate.setText("下拉刷新");         iv_pull.startAnimation(downAnimation); // 执行向下旋转         break;       case PulL: // 松开刷新状态         tvstate.setText("松开刷新");         iv_pull.startAnimation(upAnimation); // 执行向上旋转         break;       case REFRESHING: // 正在刷新中状态         iv_pull.clearanimation();         iv_pull.setVisibility(VIEw.GONE);         mProgressbar.setVisibility(VIEw.VISIBLE);         tvstate.setText("正在刷新中...");         break;       default:         break;     }   }   public voID hIDeheaderVIEw() {     header.setpadding(0,0);     iv_pull.setVisibility(VIEw.VISIBLE);     mProgressbar.setVisibility(VIEw.GONE);     tvstate.setText("下拉刷新");     tvLastUpdateTime.setText("最后刷新时间: " + getLastUpdateTime());     state = NONE;   }   public voID hIDeFooterVIEw() {     footer.setpadding(0,0);     isLoadingMore = false;   }   public voID setonRefreshListener(OnRefreshListener onRefreshListener) {     this.onRefreshListener = onRefreshListener;   }   public voID setonLoadListener(OnLoadListener onLoadListener) {     this.onLoadListener = onLoadListener;   }   public voID onRefresh() {     if (onRefreshListener != null) {       onRefreshListener.onRefresh();     }   }   public voID onLoad() {     if (onLoadListener != null) {       onLoadListener.onLoad();     }   }   public interface OnRefreshListener {//定义下拉刷新接口     public voID onRefresh();   }   public interface OnLoadListener {//定义上拉加载更多     public voID onLoad();   } } 

        上面的代码就是实现的关键.下面是头布局以及脚布局:

foot_vIEw.xml:

<?xml version="1.0" enCoding="utf-8"?> <relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:layout_wIDth="match_parent"   androID:layout_height="wrap_content">   <TextVIEw     androID:layout_wIDth="wrap_content"     androID:layout_height="wrap_content"     androID:text="加载更多"     androID:textSize="20dp"     androID:padding="10dp"     androID:layout_centerHorizontal="true"/> </relativeLayout> 

pull_to_refresh_header.xml:

<?xml version="1.0" enCoding="utf-8"?> <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:layout_wIDth="wrap_content"   androID:layout_height="wrap_content"   androID:orIEntation="horizontal">   <FrameLayout     androID:layout_wIDth="wrap_content"     androID:layout_height="wrap_content"     androID:layout_margin="10dip" >     <ImageVIEw       androID:ID="@+ID/iv_pull"       androID:layout_wIDth="wrap_content"       androID:layout_height="wrap_content"       androID:layout_gravity="center"       androID:minWIDth="30dip"       androID:src="@mipmap/xListvIEw_arrow" />     <Progressbar       androID:ID="@+ID/pb_ListvIEw_header"       androID:layout_wIDth="wrap_content"       androID:layout_height="wrap_content"       androID:layout_gravity="center"       androID:visibility="gone" />   </FrameLayout>   <linearLayout     androID:layout_wIDth="fill_parent"     androID:layout_height="wrap_content"     androID:layout_gravity="center_vertical"     androID:gravity="center_horizontal"     androID:orIEntation="vertical" >     <TextVIEw       androID:ID="@+ID/tv_ListvIEw_header_state"       androID:layout_wIDth="wrap_content"       androID:layout_height="wrap_content"       androID:text="下拉刷新"       androID:textcolor="#FF0000"       androID:textSize="18sp" />     <TextVIEw       androID:ID="@+ID/tv_ListvIEw_header_last_update_time"       androID:layout_wIDth="wrap_content"       androID:layout_height="wrap_content"       androID:layout_margintop="5dip"       androID:text="最后刷新时间: 2014-10-10 12:56:12"       androID:textcolor="@androID:color/black"       androID:textSize="14sp" />   </linearLayout> </linearLayout> 

activity_main.xml:

<?xml version="1.0" enCoding="utf-8"?> <relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   xmlns:tools="http://schemas.androID.com/tools"   androID:ID="@+ID/activity_main"   androID:layout_wIDth="match_parent"   androID:layout_height="match_parent"   androID:paddingBottom="@dimen/activity_vertical_margin"   androID:paddingleft="@dimen/activity_horizontal_margin"   androID:paddingRight="@dimen/activity_horizontal_margin"  androID:paddingtop="@dimen/activity_vertical_margin" tools:context="com.example.mic.testdemo.MainActivity">       <com.example.mic.testdemo.vIEw.autoListVIEw         androID:ID="@+ID/lv"         androID:layout_wIDth="match_parent"        androID:layout_height="match_parent">       </com.example.mic.testdemo.vIEw.autoListVIEw> </relativeLayout> 

      上面所完成的步骤就是在ListvIEw上下加载不同的布局,上面也是要复用的代码,下面的代码就是怎么使用的代码了.

MainActivity.java:

public class MainActivity extends AppCompatActivity implements autoListVIEw.OnLoadListener,autoListVIEw.OnRefreshListener {   private TextVIEw textVIEw;   private String result;   private autoListVIEw ListVIEw;   private MyAdater adater;   @OverrIDe   protected voID onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentVIEw(R.layout.activity_main);     ListVIEw = (autoListVIEw) findVIEwByID(R.ID.lv);} ListVIEw.setonRefreshListener(MainActivity.this); ListVIEw.setonLoadListener(MainActivity.this); @OverrIDe   public voID onLoad() {   }   @OverrIDe   public voID onRefresh() {} 

下面就是实现,就是在你需要的地方设置监听,以及上面加载以及刷新需要的 *** 作就可以了!

以上所述是小编给大家介绍的AndroID自定义ListvIEw布局实现上拉加载下拉刷新功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的Android自定义listview布局实现上拉加载下拉刷新功能全部内容,希望文章能够帮你解决Android自定义listview布局实现上拉加载下拉刷新功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1147459.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存