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

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

时间: 2024-09-17 20:24:46

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

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)_Android

Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) 先给大家展示下效果图: [功能] 下拉刷新和上拉分页逻辑 /下拉刷新 /上拉更多 /滚动栏 /工具栏半拉显隐 Author: surfsky.cnblogs.com Lisence: MIT 请保留此文档声明 History: init. surfsky.cnblogs.com, 2015-01 add initPosition pro

详解RecyclerView下拉刷新与上拉更多

前言 在原来的文章中我提及了如何使用RecyclerView添加header与footer,今天我们来更深入的扩展一下使用RecyclerView实现常用的下拉刷新与上拉加载更多的功能.当然这些功能的实现也是基于前面的RecyclerView添加header与footer为基础来实现的,不是很了解的可以先看看前面的文章可能能更好的帮助理解. 依赖 为了方法大家的使用我已经把他上传到Jcenter中了,所以大家可以调用下面的代码了直接获取使用: compile 'com.idisfkj.encha

上拉下拉-谁有,在fragment中的gridview加头布局的下拉刷新,上拉分页加载啊。等等等。

问题描述 谁有,在fragment中的gridview加头布局的下拉刷新,上拉分页加载啊.等等等. 就像这个页面 解决方案 怎么又提问了,这个肯定能满足你,不妨试试.https://github.com/chrisbanes/Android-PullToRefresh 解决方案二: 请自觉百度PullToRefreshGridView 解决方案三: 请自觉百度PullToRefreshGridView

Ionic如何实现下拉刷新与上拉加载功能_javascript技巧

IONIC 是目前最有潜力的一款 HTML5 手机应用开发框架.通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用. 它使用 JavaScript MVVM 框架和 AngularJS 来增强应用.提供数据的双向绑定,使用它成为 Web 和移动开发者的共同选择.Ionic是一个专注于用WEB开发技术,基于HTML5创建类似于手机平台原生应用的一个开发框架.Ionic框架的目的是从web的角度开发手机应用,基于PhoneGap的编译平台,可以实现编译成各个平台的应用程

懒人必备:多种下拉刷新,上拉加载更多以及配置自定义头部广告位库

简介 开发者使用 BGARefreshLayout-Android 可以对各种控件实现多种下拉刷新效果.上拉加载更多以及配置自定义头部广告位. 常见问题-加载更多视图无法显示. 1.BGARefreshLayout 的直接子控件的高度请使用 android:layout_height="0dp" 和 android:layout_weight="1" <cn.bingoogolapple.refreshlayout.BGARefreshLayout xmlns

基于HTML5上使用iScroll实现下拉刷新,上拉加载更多_javascript技巧

前言 前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据而已,上拉是追加数据. 使用技巧 1.引用iScroll.js, 在初始化时添加两个事件监听:touchMove.DOMContentLoaded. 2.实现iScroll插件的onScrollEnd事件, 也就是在这个事件里调用你自己的ajax方法实现数据的刷新和追加. 3.上拉加载更多请求后台时

android给listview添加下拉刷新崩溃

问题描述 android给listview添加下拉刷新崩溃 logcat: 10-09 15:17:36.549 15984-15984/com.example.jkd.fchangshi D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000 10-09 15:17:36.549 15984-15984/com.example.jkd.fchangshi I/dalvikvm﹕ Could not find method android.view.Vi

Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView_Android

首先给大家展示下效果图,感觉还不错,请继续往下阅读: 下拉刷新:        上划加载        在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个.

Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

首先给大家展示下效果图,感觉还不错,请继续往下阅读: 下拉刷新: 上划加载 在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个. 具体实现的效果有以下几条 下