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并发异常传播_错误处理解析【教程】

