布局:

<com.example.administrator.d30_myrefreshlistview.RefreshListView
android:id="@+id/refresh_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
>
<ImageView
android:id="@+id/image_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/indicator_arrow"
android:layout_centerInParent="true"
/>
<ProgressBar
android:id="@+id/pb_rotate"
android:layout_width="30dp"
android:layout_height="30dp"
android:indeterminate="false"
android:indeterminateDuration="1000"
android:indeterminateDrawable="@drawable/indecate_rotate"
android:layout_centerInParent="true"
android:visibility="invisible"
/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
>
<TextView
android:id="@+id/tv_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#aa000000"
android:text="下拉刷新"
android:layout_marginBottom="10dp"
/>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="@android:color/darker_gray"
android:text="最后刷新"
android:layout_marginBottom="10dp"
/>
</LinearLayout>
<ProgressBar
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/pb_rotate_footer"
android:indeterminateDrawable="@drawable/indecate_rotate"
android:indeterminateDuration="1000"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载..."
android:textSize="20sp"
android:textColor="#aa000000"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"/>

代码:

/*
1:创建集合,准备数据。
2:创建适配器。
3:设置适配器。
*/
public class MainActivity extends AppCompatActivity {
private RefreshListView listview;
private List<String> strs;
private MyAdapter adapter;
private boolean flag = true;//true表示下拉刷新,false表示上拉加载。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//下载数据已经完成。
//更新界面。
adapter.notifyDataSetChanged();
//RefreshListView界面要还原初始状态。
listview.completeView();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (RefreshListView) findViewById(R.id.refresh_listview);
//添加监听
listview.setOnRefreshListener(new RefreshListView.onRefreshListener() {
@Override
public void onPullRefresh() {
//模拟请求网络数据。
requestDataFromServer(true);
} @Override
public void onLoadMore() {
//模拟请求下一页网络数据。
requestDataFromServer(false);
}
});
initData();
adapter = new MyAdapter();
listview.setAdapter(adapter);
} private void requestDataFromServer(final boolean flag) {
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(3000);
//1;添加新的数据。
if(flag) {
strs.add(0, "下拉刷新的数据");
//2;通知ui线程更新界面。
handler.sendEmptyMessage(1);
}else{
//上拉加载。
strs.add("加载更多的数据"+1);
strs.add("加载更多的数据"+2);
strs.add("加载更多的数据"+3);
handler.sendEmptyMessage(1);
}
}
}).start();
} private void initData() {
strs = new ArrayList<String>();
for(int i=0;i<18;i++){
strs.add("listview 原来的数据"+i);
}
}
class MyAdapter extends BaseAdapter{ @Override
public int getCount() {
return strs.size();
} @Override
public Object getItem(int position) {
return strs.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView item_view = new TextView(MainActivity.this);
item_view.setPadding(0,10,0,10);
//设置字体
item_view.setTextSize(20);
//设置内容
item_view.setText(strs.get(position));
return item_view;
}
}
}
public class RefreshListView extends ListView implements AbsListView.OnScrollListener {
private View headerView;
private int headerView_height;
private int down_y;//按下的时候y的坐标
private static final int PULL_REFRESH = 0;//表示下拉刷新--允许下拉刷新
private static final int RELEASE_REFRESH = 1;//表示松开刷新--允许松开刷新
private static final int REFRESHING = 2;//表示正在刷新--头部完全显示。---正在请求网络数据。
private int current_state = PULL_REFRESH;//最初状态
private ImageView image_arrow;//箭头控件
private TextView tv_state, tv_time;//状态文本框,时间文本显示框。
private ProgressBar pb_rotate;//旋转动画。
private RotateAnimation downAnimation, upAnimation;
private int padding_top;//表示headview的padding_top;
private onRefreshListener listener;//使用者传过来的实现的对象。
private View footView;//底部控件。
private int footView_height;//底部控件的高度。
public RefreshListView(Context context) {
super(context);
init();
} public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} private void init() {
//设置监听
setOnScrollListener(this);
initHeaderView();
initRotateAnimation();//创建2个动画
initFooterView();
} private void initFooterView() {
footView = View.inflate(getContext(),R.layout.layout_footer,null);
footView.measure(0, 0);
footView_height =footView.getMeasuredHeight();
//设置隐藏
footView.setPadding(0, -footView_height, 0, 0);
addFooterView(footView);
} private void initRotateAnimation() {
//往下动画。
downAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
downAnimation.setDuration(300);
downAnimation.setFillAfter(true);
//往上动画
upAnimation = new RotateAnimation(-180, -360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
upAnimation.setDuration(300);
upAnimation.setFillAfter(true);
} private void initHeaderView() {
headerView = View.inflate(getContext(), R.layout.layout_header, null);
image_arrow = (ImageView) headerView.findViewById(R.id.image_arrow);
tv_state = (TextView) headerView.findViewById(R.id.tv_state);
tv_time = (TextView) headerView.findViewById(R.id.tv_time);
pb_rotate = (ProgressBar) headerView.findViewById(R.id.pb_rotate);
//设置头部控件的一些属性。--下拉刷新主要是通过更改头部控件的padding值来隐藏和显示的。
//先要计算头部控件的高度。
headerView.measure(0, 0);//先执行onMearsure();
headerView_height = headerView.getMeasuredHeight();
headerView.setPadding(0, -headerView_height, 0, 0);//隐藏头部
//添加给listview.
addHeaderView(headerView);
} @Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
down_y = (int) ev.getY();
//按下状态
break;
case MotionEvent.ACTION_MOVE:
//滑动的状态
//1:获得当前的y坐标
int y = (int) ev.getY();
//2:计算滑动了多远。
int delta_y = y - down_y;//往下滑delta_y>0,,往上滑 delta_y<0
padding_top = delta_y + (-headerView_height);
//将值设置给头部控件。
if (padding_top > -headerView_height) {//说明头部要么正好隐藏要么显示一部分或者更多。
headerView.setPadding(0, padding_top, 0, 0);
if (padding_top >= 0 && current_state == PULL_REFRESH) {
current_state = RELEASE_REFRESH;//松开刷新。
//变化
//1:箭头往上执行动画
//2:文字改变。----tv_state---松开刷新。
refreshView();
} else if (padding_top < 0 && current_state == RELEASE_REFRESH) {
current_state = PULL_REFRESH;
//变化
// 1:箭头往下执行动画
//2:文字改变---下拉刷新
refreshView();
}
return true;//消费这个事件。意思就是让listview不要有滚动的行为,杜绝listview滚动。 }
break;
case MotionEvent.ACTION_UP:
//松开的状态
if(current_state==PULL_REFRESH){
//隐藏
headerView.setPadding(0,-headerView_height,0,0);
}else if(current_state==RELEASE_REFRESH){
//更改状态。
current_state = REFRESHING;
//更新界面。
refreshView();
//5:要请求网络数据,
if(listener!=null){
listener.onPullRefresh();//请求新的数据。
}
}
break;
}
return super.onTouchEvent(ev);
}
private boolean flag;//true表示数据已经显示完。
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==SCROLL_STATE_IDLE && flag){
isLoadMore = true;
//请求下一页
//1:底部要显示。
footView.setPadding(0,0,0,0);
//2:请求下一页数据。
if(listener!=null){
listener.onLoadMore();
}
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
flag = firstVisibleItem+visibleItemCount==totalItemCount;
} public interface onRefreshListener{
void onPullRefresh();
void onLoadMore();
}
public void setOnRefreshListener(onRefreshListener listener){
this.listener = listener;
}
private void refreshView() {
switch (current_state) {
case RELEASE_REFRESH:
//动画
//1:箭头往上执行动画
image_arrow.startAnimation(upAnimation);
//2:文字改变。----tv_state---松开刷新。
tv_state.setText("松开刷新");
break;
case PULL_REFRESH:
// 1:箭头往下执行动画
image_arrow.startAnimation(downAnimation);
//2:文字改变---下拉刷新
tv_state.setText("下拉刷新");
break;
case REFRESHING:
//1:头部要正常显示。
headerView.setPadding(0, 0, 0, 0);
//2:箭头隐藏
image_arrow.setVisibility(INVISIBLE);
//3:进度条显示。
pb_rotate.setVisibility(VISIBLE);
//4:文字更改。
tv_state.setText("正在刷新");
break; }
}
private boolean isLoadMore;//true表示上拉加载,false表示下拉刷新。
//还原初始化状态。
public void completeView(){
if(!isLoadMore) {
//1:箭头要显示。
image_arrow.clearAnimation();//这个时候有可能箭头有可能在执行动画。将动画进行清除。
image_arrow.setVisibility(VISIBLE);
//2:进度动画要隐藏
pb_rotate.setVisibility(INVISIBLE);
//3:tv_state文字改变为下拉刷新。
tv_state.setText("下拉刷新");
//4;状态---更改为下拉刷新。
current_state = PULL_REFRESH;
//5:tv_time更改为当前的时间
tv_time.setText(getTime());
//隐藏
headerView.setPadding(0, -headerView_height, 0, 0);
}else{
footView.setPadding(0,-footView_height,0,0);
isLoadMore = false;
// 定位到最后一条。
setSelection(getCount()-1);//定位到最后一条数据。
}
}
private String getTime(){
SimpleDateFormat format = new SimpleDateFormat("yyyy MM dd HH:mm:ss");
return format.format(new Date());
}
}

【框架】RefreshListView下拉刷新的更多相关文章

  1. 第三方开源框架的下拉刷新列表(QQ比较常用的)。

    PullToRefreshListView是第三方开源框架下拉刷新列表,比较流行的QQ 微信等上面都在用. 下载地址(此开源框架于2013年后不再更新) 点此下载 package com.lixu.k ...

  2. RefreshListView下拉刷新

    布局: <com.example.administrator.d30_myrefreshlistview.RefreshListView android:id="@+id/refres ...

  3. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  4. Android 下拉刷新框架实现

    原文地址:http://blog.csdn.net/leehong2005/article/details/12567757 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些 ...

  5. Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  6. Android智能下拉刷新加载框架—看这些就够了

    一些值得学习的几个下拉刷新上拉加载开源库 Android智能下拉刷新框架-SmartRefreshLayout 支持所有的 View(AbsListView.RecyclerView.WebView. ...

  7. 【学习笔记】js下拉刷新、上拉加载 mescroll框架的使用

    写在前边: 工作需要,使用ajax在原来的列表下边使用ajax请求后台数据,拼接在列表最下边,在github转了好久,发现了一个bug极多的js刷新插件,尝试了一个下午,就在快放弃的时候,发现下边有留 ...

  8. 使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。

    套用mui官方文档的一句话:“开发者只需关心业务逻辑,实现加载更多数据即可”.真的是不错的框架. 想更多的了解这个框架:http://dev.dcloud.net.cn/mui/ 那么如何实现下拉刷新 ...

  9. ios 下拉刷新开源框架 MJRefresh

    gitHub 下载框架 搜索MJExampleViewController.h 下拉刷新 MJTableViewController 上拉刷新 MJTableViewController Collec ...

随机推荐

  1. javafx之CSS初探

    文档:http://www.haogongju.net/art/1807238 javafx中的css元素必须有-fx-前缀. 一.介绍 java8中新增了javafx.css开放了css相关api. ...

  2. 下面将详细说明useradd与usermod 的参数及用法!

    下面将详细说明useradd与usermod 的参数及用法! 说到这里要另外两句,关于linux下口令相关的文件存放位置说明/usr/bin/passwd 包含 passwd 命令. /etc/pas ...

  3. C++中map的基本操作和使用;

    注:本文来自sina live 的博文 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本 ...

  4. 优化sql语句

    关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...

  5. gvim-ide plugins

    omnicppcomplete-0.41.zip after: ftplugin: c.vim,cpp.vim,两个文件的内容相同, 其中都只有一个call语句: call omni#cpp#comp ...

  6. Spell checker(暴力)

    Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20188   Accepted: 7404 De ...

  7. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  8. search in 2d matrix and serach minimum in rotated array

    import java.io.*; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Collecti ...

  9. java常见异常集锦

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  10. HDU 1176免费馅饼 DP数塔问题转化

    L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...