Android使用ListView实现下拉刷新及上拉显示更多的方法

发布时间 - 2026-01-10 23:19:41    点击率:

本文实例讲述了Android使用ListView实现下拉刷新及上拉显示更多的方法。分享给大家供大家参考,具体如下:

今天得需求是做listview+上下拉动在header和footer显示progressdialog,但不影响用户操作

直接上代码,我已经加上注释了,自己看。

package com.stay.main;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.stay.wifi.R;
/**
 * @author Stay
 * 动态加载listview数据,上拉 刷新,下拉 更多
 */
public class ListViewActivity extends Activity implements OnScrollListener {
  private static final int LOAD = 0;
  private static final int ERROR = 0;
  private static final int MEMBER = 1;
  private static final int LOADED = 2;
  private static final int DIALOG = 3;
  private static final int FULL = 4;
  private NearbyAdapter adapter;
  private ListView nearby_lv;
  private RelativeLayout nearby_lv_header;
  private Button list_bottom_btn;
  private LinearLayout list_bottom_linear;
  private TextView bottom_progress_text;
  private RelativeLayout nearby_lv_footer;
  private Button list_header_btn;
  private LinearLayout list_header_linear;
  private TextView heard_progress_text;
  private ArrayList<JSONObject> nearby_data = new ArrayList<JSONObject>();
  private int lastItem;
  private HashMap<String, Drawable> imageCache;
  private com.stay.main.ListViewActivity.MyHandler myHandler;
  private ProgressDialog dialog;
  private int curPage = 1;
  private boolean isMember = false;
  private int firstItem;
  public int count;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    initView();
    myHandler.sendEmptyMessage(LOAD);
  }
  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    DebugUtil.debug("onScrollStateChanged");
    //当滚动停止且滚动的总数等于数据的总数,去加载
    if (lastItem == count && scrollState == SCROLL_STATE_IDLE) {
      DebugUtil.debug("onScrollStateChanged--------next");
      if (curPage == 4 && !isMember) {
        DebugUtil.show(this, "您不是正式会员,请申请正式会员,");
        list_bottom_linear.setVisibility(View.GONE);
      } else {
        //加载数据
        myHandler.sendEmptyMessage(LOAD);
      }
      return;
    }
    //当往上拉时更新数据,将data清空然后去重新加载
    if (firstItem == 0 && scrollState == SCROLL_STATE_IDLE) {
      DebugUtil.debug("onScrollStateChanged--------refresh");
      curPage = 0;
      myHandler.sendEmptyMessage(LOAD);
    }
  }
  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    DebugUtil.debug("firstVisibleItem=" + firstVisibleItem);
    DebugUtil.debug("visibleItemCount=" + visibleItemCount);
    DebugUtil.debug("totalItemCount=" + totalItemCount);
    //这里要减二,因为我加了header footer
    lastItem = firstVisibleItem + visibleItemCount - 2;
    firstItem = firstVisibleItem;
  }
  public int getData() {
    try {
      HttpURLConnection conn = DownloadUtil.download(url//自己写咯);
      ArrayList<JSONObject> temp = JSONUtil.streamToJsonList(conn.getInputStream());
      if (curPage == 0 && nearby_data.size() > 0) {
        nearby_data.clear();
        count = 0;
      }
      if (temp != null && temp.size() > 0) {
        count += temp.size();
        nearby_data.addAll(temp);
        DebugUtil.debug("nearby_data.size()="+nearby_data.size());
      } else {
        return FULL;
      }
      return LOADED;
    } catch (Exception e) {
      return ERROR;
    }
  }
  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      switch (msg.what) {
      case DIALOG:
        list_bottom_linear.setVisibility(View.VISIBLE);
        list_header_linear.setVisibility(View.VISIBLE);
        break;
      case LOADED:
        list_bottom_linear.setVisibility(View.GONE);
        list_header_linear.setVisibility(View.GONE);
        curPage++;
        adapter.notifyDataSetChanged();
        break;
      case ERROR:
        DebugUtil.debug("error,missing data");
        break;
      case MEMBER:
        DebugUtil.debug("you must regist formal member");
        break;
      default:
        break;
      }
    }
  };
//创建子线程加载数据,然后更新
  private class MyHandler extends Handler {
    private int status;
    public MyHandler(Looper looper) {
      super(looper);
    }
    @Override
    public void handleMessage(Message msg) {
      synchronized (this) {
        switch (msg.what) {
        case LOAD:// get data from server
          handler.sendEmptyMessage(DIALOG);//显示等待框
          status = getData();
          handler.sendEmptyMessageDelayed(status, 1000);
          break;
        default:
          break;
        }
      }
    }
  }
  public void initView() {
    imageCache = new HashMap<String, Drawable>();
    HandlerThread handlerThread = new HandlerThread("nearby");
    // 在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
    handlerThread.start();
    myHandler = new MyHandler(handlerThread.getLooper());
    nearby_lv = (ListView) findViewById(R.id.nearby_lv);
    nearby_lv_footer = (RelativeLayout) LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header, null);
    list_bottom_btn = (Button) nearby_lv_footer.findViewById(R.id.list_bottom_btn);
    list_bottom_linear = (LinearLayout) nearby_lv_footer.findViewById(R.id.list_bottom_linear);
    bottom_progress_text = (TextView) nearby_lv_footer.findViewById(R.id.progress_text);
    nearby_lv_header = (RelativeLayout) LayoutInflater.from(ListViewActivity.this).inflate(R.layout.nearby_lv_header, null);
    list_header_btn = (Button) nearby_lv_header.findViewById(R.id.list_bottom_btn);
    list_header_linear = (LinearLayout) nearby_lv_header.findViewById(R.id.list_bottom_linear);
    heard_progress_text = (TextView) nearby_lv_header.findViewById(R.id.progress_text);
    list_header_btn.setText("刷新");
    list_bottom_btn.setText("更多");
    list_header_linear.setVisibility(View.GONE);
    nearby_lv.addHeaderView(nearby_lv_header);
    nearby_lv.addFooterView(nearby_lv_footer);
    // list_header_btn.setOnClickListener(header_click);
    adapter = new NearbyAdapter(ListViewActivity.this, nearby_data);
    nearby_lv.setAdapter(adapter);
    nearby_lv.setOnScrollListener(ListViewActivity.this);
  }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android Service组件使用技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android操作json格式数据技巧总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


# Android  # ListView  # 下拉刷新  # 上拉显示更多  # Android-自定义控件之ListView下拉刷新的实现  # Android自定义渐变式炫酷ListView下拉刷新动画  # Android中Listview下拉刷新和上拉加载更多的多种实现方案  # Android ListView实现上拉加载下拉刷新和滑动删除功能  # Android自定义listview布局实现上拉加载下拉刷新功能  # Android中ListView下拉刷新的实现代码  # 加载  # 进阶  # 操作技巧  # 相关内容  # 感兴趣  # 给大家  # 但不  # 更多关于  # 您不  # 所述  # 必须先  # 程序设计  # 使用技巧  # 清空  # 我已经  # 因为我  # 讲述了  # 往上拉  # extends  # implements 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Sanctum进行API认证?(SPA实战)  jQuery中的100个技巧汇总  Mybatis 中的insertOrUpdate操作  Laravel如何处理CORS跨域请求?(配置示例)  如何实现建站之星域名转发设置?  Android使用GridView实现日历的简单功能  大型企业网站制作流程,做网站需要注册公司吗?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在阿里云ECS服务器部署织梦CMS网站?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何彻底删除建站之星生成的Banner?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  MySQL查询结果复制到新表的方法(更新、插入)  如何用AWS免费套餐快速搭建高效网站?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  linux top下的 minerd 木马清除方法  JavaScript中的标签模板是什么_它如何扩展字符串功能  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何在阿里云通过域名搭建网站?  java获取注册ip实例  如何为不同团队 ID 动态生成多个独立按钮  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何快速生成凡客建站的专业级图册?  网站制作报价单模板图片,小松挖机官方网站报价?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何获取上海专业网站定制建站电话?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  微信小程序 HTTPS报错整理常见问题及解决方案  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何快速搭建高效WAP手机网站?  如何在Windows服务器上快速搭建网站?  免费视频制作网站,更新又快又好的免费电影网站?  JS实现鼠标移上去显示图片或微信二维码  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  EditPlus 正则表达式 实战(3)  焦点电影公司作品,电影焦点结局是什么?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Python数据仓库与ETL构建实战_Airflow调度流程详解  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Python并发异常传播_错误处理解析【教程】