Android使用ListView实现下拉刷新及上拉显示更多的方法
作者:Jacob-wj 发布时间:2023-01-10 04:29:45
标签:Android,ListView,刷新
本文实例讲述了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程序设计有所帮助。


猜你喜欢
- 一、项目简述本系统功能包括: 一款基于Springboot+Vue的电商项目,前后端分离项目,前台后台都有,前台商品展示购买,购物车分类,订
- 验证用户是否已经登录package cn.hongxin.filter;import java.io.IOException;import
- 一.mybatis的配置1.1 添加相应的jar包在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在lib文件夹下面加
- 在Maven工程里运行Java main方法mvn compilemvn exec:java -Dexec.mainClass="
- Spring实例Bean的方法Spring实例Bean的方法,在AbstractAutowireCapableBeanFactory中的pr
- 一个项目中需要使用两个数据库,Oracle 和Mysql,于是参考各个blog,实现此功能。写好后才发现,原来的事务失效了,我去...spr
- 一、线程间等待与唤醒机制wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使
- /// <summary> /// 读写INI文件的类。
- 不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统。ssh框架项
- 整理文档,搜刮出一个java Servlet 实现动态验证码图片的代码,稍微整理精简一下做下分享。package com.hacker;im
- 什么是EurekaNetflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spr
- 根据poi接收controller层的excel文件导入 可使用后缀
- C#写入xml文件1、XmlDocument1。我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- unity场景加载分为同步加载和异步加载,供大家参考,具体内容如下同步加载 loadScene首先将前置工作做好。创建一个项目工程,然后创建
- 定义享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式
- 本文实例为大家分享了Android实现手机多点触摸画圆的具体代码,供大家参考,具体内容如下静态效果图:(多个手指按下和抬起的状态)代码实现部
- 前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jd
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到
- 最近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用 * 实现自动定位的。我想实现一种效果:当用户进入UI时,不定位,用户需要定