简单的下拉刷新,上拉刷新的原理(PullToRefresh)
来源:互联网 发布:红米note3root软件 编辑:程序博客网 时间:2024/05/16 05:48
实现 ListView 的上拉刷新和下拉刷新,需要使用 ListView 的 setOnScrollListener() 监听器,具体的内容如代码中的注释。效果如下:
MainActivity.java :
package com.android.pulltorefresh;import java.util.ArrayList;import com.android.pulltorefresh.MyListView.OnRefreshListener;import android.app.Activity;import android.app.ProgressDialog;import android.gesture.Gesture;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {private ArrayAdapter adapter;private ArrayList<String> data;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyListView myListView = (MyListView)findViewById(R.id.myList);data = new ArrayList<String>();// 此处只是为了测试刷新,故此给出了19个数,// 如果给出的数目小于当前屏幕所能容纳的 ListView 列表项,则会出 bug (顶部,底部同时刷新)// 如果想要解决该 bug 可以使用 Gesture,通过 上下滑动的速度来控制刷新for (int i = 1; i < 20; i++){data.add("第i个数据:" + i);}adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);myListView.setAdapter(adapter);myListView.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onTopRefresh() {addTopData();}@Overridepublic void onBottomRefresh() {addBottomData();}});// 此部分应该从 MainActivity 中分离出去(如 MyListView.java),减少代码的耦合度,增加扩展性/*myListView.setOnScrollListener(new OnScrollListener() {private int firstVisibleItem, visibleItemCount, totalItemCount;@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {if (firstVisibleItem == 0) {addTopData();}// 有 bugif (firstVisibleItem + visibleItemCount == totalItemCount) {addBottomData();}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {this.firstVisibleItem = firstVisibleItem;this.visibleItemCount = visibleItemCount;this.totalItemCount = totalItemCount;}});*/}/** * 在顶部添加数据(刷新) */protected void addTopData() {/* 此处只是为了测试刷新,让其 3 秒刷新一次 , * 可在 AsyncTask 中使用 ProgressDialog 加载下载图片时的进度对话框增加其效果*/runOnUiThread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);data.add(0, "头部新增的数据:" + (data.size() + 1));adapter.notifyDataSetChanged();} catch (InterruptedException e) {e.printStackTrace();}}});}/** * 在底部添加数据(刷新) */protected void addBottomData() {data.add("底部新增的数据:" + (data.size() + 1));adapter.notifyDataSetChanged();}}
MyListView.java :
package com.android.pulltorefresh;import android.content.Context;import android.util.AttributeSet;import android.widget.AbsListView;import android.widget.ListView;public class MyListView extends ListView{/* 接口对象 */public OnRefreshListener mOnRefreshListener;/** * 定义一个回调接口,供使用者调用(与使用者实现交互) */public interface OnRefreshListener{// 下拉刷新public void onTopRefresh();// 上拉刷新public void onBottomRefresh();}/** * 供使用者调用的方法,该方法中有接口所定义的两个 刷新方法; */public void setOnRefreshListener(OnRefreshListener refresh){mOnRefreshListener = refresh;/* MyListView 的刷新监听器 */setOnScrollListener(new OnScrollListener() {private int firstVisibleItem,visibleItemCount, totalItemCount;@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {if (firstVisibleItem == 0) {// 回调在接口中定义的 下拉刷新mOnRefreshListener.onTopRefresh();}// 有 bug(如在 MainActivity.java 所说)if (firstVisibleItem + visibleItemCount == totalItemCount) {// 回调在接口中定义的 上拉刷新mOnRefreshListener.onBottomRefresh();}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {// 初始化,滑动 ListView 时的3种状态this.firstVisibleItem = firstVisibleItem;this.visibleItemCount = visibleItemCount;this.totalItemCount = totalItemCount;}});}public MyListView(Context context) {super(context);}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);}public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}}
activity.java :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.android.pulltorefresh.MainActivity" > <com.android.pulltorefresh.MyListView android:id="@+id/myList" android:layout_width="match_parent" android:layout_height="wrap_content" /></RelativeLayout>
0 0
- 简单的下拉刷新,上拉刷新的原理(PullToRefresh)
- PullToRefresh的上拉加载下拉刷新
- PullToRefresh的下拉刷新,上拉加载的应用
- PullToRefresh实现下拉上拉刷新,xUtils开源库的运用
- Android PullToRefresh下拉刷新,上拉加载的使用详解
- 支持下拉刷新、上拉加载的RecyclerView,基于PullToRefresh
- Android-PullToRefresh下拉刷新,上拉加载的使用详解
- Android-PullToRefresh下拉上拉刷新的库基本用法
- Android PullToRefresh下拉刷新,上拉加载的使用详解
- PullToRefresh的实现上拉刷新下拉加载
- PullToRefresh上拉刷新下拉加载更多的使用
- PullToRefresh的实现上拉刷新下拉加载
- PullToRefresh的实现上拉刷新下拉加载
- PullToRefresh上拉刷新和下拉刷新
- PullToRefresh实现简单的下拉刷新和上拉加载更多
- PullToRefresh 上拉刷新,下拉加载数据 框架的简单使用
- 上拉加载下拉刷新的原理
- 上拉和下拉刷新的原理
- 前端开发-HTML5基础
- 机器人路径规划_蚁群算法
- python处理log数据
- Android开发经验总结
- undefined reference to glulookat
- 简单的下拉刷新,上拉刷新的原理(PullToRefresh)
- iOS适配 旧项目工程在iOS9下不能正常显示
- Failed to load JavaHL Library解决方法
- html乱码原因与网页乱码解决方法
- 机器人路径规划_A*算法
- Windows Phone版使用移动广告平台集成Google Mobile Ads SDK教程
- Android佳博网络打印机例子
- 双向Dijstra算法
- Mybatis3源码分析(04)-加载Configuration-XMLMapperBuilder加载ResultMap