全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android ListView实现下拉加载功能

本文实例为大家分享了ListView下拉加载展示的具体代码,供大家参考,具体内容如下

1、MyListView.Java

public class MyListView extends ListView implements OnScrollListener { 
 
 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; 
 
 // 实际的padding的距离与界面上偏移距离的比例 
 private final static int RATIO = 3; 
 private LayoutInflater inflater; 
 
 // ListView头部下拉刷新的布局 
 private LinearLayout headerView; 
 private TextView lvHeaderTipsTv; 
 private TextView lvHeaderLastUpdatedTv; 
 private ImageView lvHeaderArrowIv; 
 private ProgressBar lvHeaderProgressBar; 
 
 // 定义头部下拉刷新的布局的高度 
 private int headerContentHeight; 
 
 private RotateAnimation animation; 
 private RotateAnimation reverseAnimation; 
 
 private int startY; 
 private int state; 
 private boolean isBack; 
 
 // 用于保证startY的值在一个完整的touch事件中只被记录一次 
 private boolean isRecored; 
 
 private OnRefreshListener refreshListener; 
 
 private boolean isRefreshable; 
 
 public MyListView(Context context) { 
  super(context); 
  init(context); 
 } 
 
 public MyListView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  init(context); 
 } 
 
 private void init(Context context) { 
  inflater = LayoutInflater.from(context); 
  headerView = (LinearLayout) inflater.inflate(R.layout.lv_header, null); 
  lvHeaderTipsTv = (TextView) headerView 
    .findViewById(R.id.lvHeaderTipsTv); 
  lvHeaderLastUpdatedTv = (TextView) headerView 
    .findViewById(R.id.lvHeaderLastUpdatedTv); 
 
  lvHeaderArrowIv = (ImageView) headerView 
    .findViewById(R.id.lvHeaderArrowIv); 
  // 设置下拉刷新图标的最小高度和宽度 
  lvHeaderArrowIv.setMinimumWidth(70); 
  lvHeaderArrowIv.setMinimumHeight(50); 
 
  lvHeaderProgressBar = (ProgressBar) headerView 
    .findViewById(R.id.lvHeaderProgressBar); 
  measureView(headerView); 
  headerContentHeight = headerView.getMeasuredHeight(); 
  // 设置内边距,正好距离顶部为一个负的整个布局的高度,正好把头部隐藏 
  headerView.setPadding(0, -1 * headerContentHeight, 0, 0); 
  // 重绘一下 
  headerView.invalidate(); 
  // 将下拉刷新的布局加入ListView的顶部 
  addHeaderView(headerView, null, false); 
  // 设置滚动监听事件 
  setOnScrollListener(this); 
 
  // 设置旋转动画事件 
  animation = new RotateAnimation(0, -180, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_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); 
 
  // 一开始的状态就是下拉刷新完的状态,所以为DONE 
  state = DONE; 
  // 是否正在刷新 
  isRefreshable = false; 
 } 
 
 @Override 
 public void onScrollStateChanged(AbsListView view, int scrollState) { 
 
 } 
 
 @Override 
 public void onScroll(AbsListView view, int firstVisibleItem, 
   int visibleItemCount, int totalItemCount) { 
  if (firstVisibleItem == 0) { 
   isRefreshable = true; 
  } else { 
   isRefreshable = false; 
  } 
 } 
 
 @Override 
 public boolean onTouchEvent(MotionEvent ev) { 
  if (isRefreshable) { 
   switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
    if (!isRecored) { 
     isRecored = true; 
     startY = (int) ev.getY();// 手指按下时记录当前位置 
    } 
    break; 
   case MotionEvent.ACTION_UP: 
    if (state != REFRESHING && state != LOADING) { 
     if (state == PULL_To_REFRESH) { 
      state = DONE; 
      changeHeaderViewByState(); 
     } 
     if (state == RELEASE_To_REFRESH) { 
      state = REFRESHING; 
      changeHeaderViewByState(); 
      onLvRefresh(); 
     } 
    } 
    isRecored = false; 
    isBack = false; 
 
    break; 
 
   case MotionEvent.ACTION_MOVE: 
    int tempY = (int) ev.getY(); 
    if (!isRecored) { 
     isRecored = true; 
     startY = tempY; 
    } 
    if (state != REFRESHING && isRecored && state != LOADING) { 
     // 保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动 
     // 可以松手去刷新了 
     if (state == RELEASE_To_REFRESH) { 
      setSelection(0); 
      // 往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步 
      if (((tempY - startY) / RATIO < headerContentHeight)// 由松开刷新状态转变到下拉刷新状态 
        && (tempY - startY) > 0) { 
       state = PULL_To_REFRESH; 
       changeHeaderViewByState(); 
      } 
      // 一下子推到顶了 
      else if (tempY - startY <= 0) {// 由松开刷新状态转变到done状态 
       state = DONE; 
       changeHeaderViewByState(); 
      } 
     } 
     // 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态 
     if (state == PULL_To_REFRESH) { 
      setSelection(0); 
      // 下拉到可以进入RELEASE_TO_REFRESH的状态 
      if ((tempY - startY) / RATIO >= headerContentHeight) {// 由done或者下拉刷新状态转变到松开刷新 
       state = RELEASE_To_REFRESH; 
       isBack = true; 
       changeHeaderViewByState(); 
      } 
      // 上推到顶了 
      else if (tempY - startY <= 0) {// 由DOne或者下拉刷新状态转变到done状态 
       state = DONE; 
       changeHeaderViewByState(); 
      } 
     } 
     // done状态下 
     if (state == DONE) { 
      if (tempY - startY > 0) { 
       state = PULL_To_REFRESH; 
       changeHeaderViewByState(); 
      } 
     } 
     // 更新headView的size 
     if (state == PULL_To_REFRESH) { 
      headerView.setPadding(0, -1 * headerContentHeight 
        + (tempY - startY) / RATIO, 0, 0); 
 
     } 
     // 更新headView的paddingTop 
     if (state == RELEASE_To_REFRESH) { 
      headerView.setPadding(0, (tempY - startY) / RATIO 
        - headerContentHeight, 0, 0); 
     } 
 
    } 
    break; 
 
   default: 
    break; 
   } 
  } 
  return super.onTouchEvent(ev); 
 } 
 
 // 当状态改变时候,调用该方法,以更新界面 
 private void changeHeaderViewByState() { 
  switch (state) { 
  case RELEASE_To_REFRESH: 
   lvHeaderArrowIv.setVisibility(View.VISIBLE); 
   lvHeaderProgressBar.setVisibility(View.GONE); 
   lvHeaderTipsTv.setVisibility(View.VISIBLE); 
   lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE); 
 
   lvHeaderArrowIv.clearAnimation();// 清除动画 
   lvHeaderArrowIv.startAnimation(animation);// 开始动画效果 
 
   lvHeaderTipsTv.setText("松开刷新"); 
   break; 
  case PULL_To_REFRESH: 
   lvHeaderProgressBar.setVisibility(View.GONE); 
   lvHeaderTipsTv.setVisibility(View.VISIBLE); 
   lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE); 
   lvHeaderArrowIv.clearAnimation(); 
   lvHeaderArrowIv.setVisibility(View.VISIBLE); 
   // 是由RELEASE_To_REFRESH状态转变来的 
   if (isBack) { 
    isBack = false; 
    lvHeaderArrowIv.clearAnimation(); 
    lvHeaderArrowIv.startAnimation(reverseAnimation); 
 
    lvHeaderTipsTv.setText("下拉刷新"); 
   } else { 
    lvHeaderTipsTv.setText("下拉刷新"); 
   } 
   break; 
 
  case REFRESHING: 
 
   headerView.setPadding(0, 0, 0, 0); 
 
   lvHeaderProgressBar.setVisibility(View.VISIBLE); 
   lvHeaderArrowIv.clearAnimation(); 
   lvHeaderArrowIv.setVisibility(View.GONE); 
   lvHeaderTipsTv.setText("正在刷新..."); 
   lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE); 
   break; 
  case DONE: 
   headerView.setPadding(0, -1 * headerContentHeight, 0, 0); 
 
   lvHeaderProgressBar.setVisibility(View.GONE); 
   lvHeaderArrowIv.clearAnimation(); 
   lvHeaderArrowIv.setImageResource(R.drawable.arrow); 
   lvHeaderTipsTv.setText("下拉刷新"); 
   lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE); 
   break; 
  } 
 } 
 
 // 此方法直接照搬自网络上的一个下拉刷新的demo,此处是“估计”headView的width以及height 
 private void measureView(View child) { 
  ViewGroup.LayoutParams params = child.getLayoutParams(); 
  if (params == null) { 
   params = new ViewGroup.LayoutParams( 
     ViewGroup.LayoutParams.FILL_PARENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT); 
  } 
  int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, 
    params.width); 
  int lpHeight = params.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 setonRefreshListener(OnRefreshListener refreshListener) { 
  this.refreshListener = refreshListener; 
  isRefreshable = true; 
 } 
 
 public interface OnRefreshListener { 
  public void onRefresh(); 
 } 
 
 public void onRefreshComplete() { 
  state = DONE; 
  lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString()); 
  changeHeaderViewByState(); 
 } 
 
 private void onLvRefresh() { 
  if (refreshListener != null) { 
   refreshListener.onRefresh(); 
  } 
 } 
 
 public void setAdapter(LvAdapter adapter) { 
  lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString()); 
  super.setAdapter(adapter); 
 } 
 
} 

2、MainActivity.java

public class MainActivity extends Activity { 
 private List<String> list; 
 private MyListView lv; 
 private LvAdapter adapter; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  lv = (MyListView) findViewById(R.id.lv); 
  list = new ArrayList<String>(); 
  list.add("loonggg"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  list.add("我们都是开发者"); 
  adapter = new LvAdapter(list, this); 
  lv.setAdapter(adapter); 
 
  lv.setonRefreshListener(new OnRefreshListener() { 
 
   @Override 
   public void onRefresh() { 
    new AsyncTask<Void, Void, Void>() { 
     protected Void doInBackground(Void... params) { 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      list.add("刷新后添加的内容"); 
      return null; 
     } 
 
     @Override 
     protected void onPostExecute(Void result) { 
      adapter.notifyDataSetChanged(); 
      lv.onRefreshComplete(); 
     } 
    }.execute(null, null, null); 
   } 
  }); 
 } 
} 

3、LvAdapter
public class LvAdapter extends BaseAdapter { 
    private List<String> list; 
    private Context context; 
 
    public LvAdapter(List<String> list, Context context) { 
        this.list = list; 
        this.context = context; 
    } 
 
    @Override 
    public int getCount() { 
        return list.size(); 
    } 
 
    @Override 
    public Object getItem(int position) { 
        return list.get(position); 
    } 
 
    @Override 
    public long getItemId(int position) { 
        return position; 
    } 
 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        TextView tv = new TextView(context.getApplicationContext()); 
        tv.setText(list.get(position)); 
        return tv; 
    } 
 

4、lv_header.xml
[html] view plain copy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#000000" > 
 
    <!-- 内容 --> 
 
    <RelativeLayout 
        android:id="@+id/head_contentLayout" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:paddingLeft="30dp" > 
 
        <!-- 箭头图像、进度条 --> 
 
        <FrameLayout 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_alignParentLeft="true" 
            android:layout_centerVertical="true" > 
 
            <!-- 箭头 --> 
 
            <ImageView 
                android:id="@+id/lvHeaderArrowIv" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center" 
                android:src="@drawable/arrow" /> 
 
            <!-- 进度条 --> 
 
            <ProgressBar 
                android:id="@+id/lvHeaderProgressBar" 
                style="?android:attr/progressBarStyleSmall" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center" 
                android:visibility="gone" /> 
        </FrameLayout> 
 
        <!-- 提示、最近更新 --> 
 
        <LinearLayout 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_centerHorizontal="true" 
            android:gravity="center_horizontal" 
            android:orientation="vertical" > 
 
            <!-- 提示 --> 
 
            <TextView 
                android:id="@+id/lvHeaderTipsTv" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="下拉刷新" 
                android:textColor="#fff" 
                android:textSize="20sp" /> 
 
            <!-- 最近更新 --> 
 
            <TextView 
                android:id="@+id/lvHeaderLastUpdatedTv" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="上次更新" 
                android:textColor="#333" 
                android:textSize="10sp" /> 
        </LinearLayout> 
    </RelativeLayout> 
 
</LinearLayout> 

5、main.xml
[html] view plain copy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#000000" 
    android:orientation="vertical" > 
 
    <net.loonggg.listview.MyListView 
        android:id="@+id/lv" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" /> 
 
</LinearLayout> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ListView  # 下拉  # 加载  # android ListView结合xutils3仿微信实现下拉加载更多  # Android仿网易一元夺宝客户端下拉加载动画效果(一)  # Android实现仿慕课网下拉加载动画  # Android中使用RecyclerView实现下拉刷新和上拉加载  # Android下拉刷新上拉加载控件(适用于所有View)  # Android RecyclerView实现下拉刷新和上拉加载  # android开发教程之实现listview下拉刷新和上拉刷新效果  # Android实现上拉加载更多以及下拉刷新功能(ListView)  # Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法  # PullToRefreshListView实现多条目加载上拉刷新和下拉加载  # 都是  # 最近更新  # 推到  # 还没有  # 顶了  # 进度条  # 是由  # 或者是  # 按下  # 在上  # 大家分享  # 往上  # 拉到  # 推了  # 具体内容  # 大家多多  # 过程中  # 状态下  # 事件中 


相关文章: 如何高效利用200m空间完成建站?  在线制作视频网站免费,都有哪些好的动漫网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何用花生壳三步快速搭建专属网站?  如何快速生成高效建站系统源代码?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站主机选择指南:服务器配置与SEO优化实战技巧  如何在云指建站中生成FTP站点?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  实现虚拟支付需哪些建站技术支撑?  如何在服务器上配置二级域名建站?  如何确保西部建站助手FTP传输的安全性?  Python文件管理规范_工程实践说明【指导】  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  XML的“混合内容”是什么 怎么用DTD或XSD定义  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  建站主机助手选型指南:2025年热门推荐与高效部署技巧  广东企业建站网站优化与SEO营销核心策略指南  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何配置支付宝与微信支付功能?  如何将凡科建站内容保存为本地文件?  建站上传速度慢?如何优化加速网站加载效率?  高端建站三要素:定制模板、企业官网与响应式设计优化  海南网站制作公司有哪些,海口网是哪家的?  如何选择高效便捷的WAP商城建站系统?  北京企业网站设计制作公司,北京铁路集团官方网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  制作旅游网站html,怎样注册旅游网站?  黑客如何通过漏洞一步步攻陷网站服务器?  独立制作一个网站多少钱,建立网站需要花多少钱?  建站之星如何保障用户数据免受黑客入侵?  如何使用Golang table-driven基准测试_多组数据测量函数效率  视频网站制作教程,怎么样制作优酷网的小视频?  如何用wdcp快速搭建高效网站?  建站之星免费版是否永久可用?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何配置IIS站点权限与局域网访问?  如何使用Golang安装API文档生成工具_快速生成接口文档  ,购物网站怎么盈利呢?  建站VPS选购需注意哪些关键参数?  如何快速辨别茅台真假?关键步骤解析  简历在线制作网站免费版,如何创建个人简历?  建站之星后台管理系统如何操作?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何在万网ECS上快速搭建专属网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。