下拉刷新实现步骤分析
1.自定义一个类RefreshListView继承ListView,必须重写带有两个参数的构造方法
2.在构造方法中实例化下拉刷新空间,布局文件refresh_header.xml 自定义ProgressBar,实现红色的圈圈效果
3.实现下拉刷新的效果的原理
view.setPadding(0,-控件的高,0,0);//下拉刷新控件完全隐藏 view.setPadding(0,0,0,0);//下拉刷新控件完全显示 view.setPadding(0,控件的高,0,0);//下拉刷新控件2倍完全显示
4.重写onTouchEvent()当手指在屏幕滑动的时候,下拉刷新空间动态隐藏和显示
int padintTop = -控件的高 + (endY - start)
view.setPadding(0,padintTop,0,0);//下拉刷新控件动态的隐藏和显示
1.记录y轴上的起始坐标 startY
2.重写onTouchEvent();在按下的时候记录startY
3.在移动的时候记录 endY
4.计算偏移量 int distanceY = endY - startY
if(distanceY >0){
int padintTop = -控件的高 + distanceY
view.setPadding(0,padintTop,0,0);//下拉刷新控件动态的隐藏和显示
}
5.判断顶部轮播图部分是否完全显示-加载更多的bug 怎么判断是否完全显示呢? 当ListView在屏幕上的Y轴坐标小于或者等于顶部轮播图在Y轴的坐标的时候,顶部轮播图完全显示了
在屏幕上移动的时候
//顶部轮播都没有完全显示,你下拉刷新控件就不需要显示 boolean isDisplayTopNews = isDisplayTopNews();
if(!isDisplayTopNews){
break;
}
addView 添加一个子View
addHeaderView 在ListView中添加一个头部
6.刷新状态切换的实现
/** 下拉刷新状态 */ public static final int PULLDOWNREFRESH = 0;
/**
手松刷新状态
*/
public static final int RELEASE_REFRESH = 1;
/**
正在刷新状态
*/
public static final int REFRESHING = 2;
private int currentStatus = PULL_DOWN_REFRESH;
设置旋转动画
/**
* 初始化动画
*/
private void initAnimation() {
upAnimation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
upAnimation.setDuration(500);
upAnimation.setFillAfter(true);
donwnAnimation = new RotateAnimation(-180, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
donwnAnimation.setDuration(500);
donwnAnimation.setFillAfter(true);
}
更新状态
private void refreshHeanderViewStatu() {
switch (currentStatus) {
case PULL_DOWN_REFRESH://下拉刷新
iv_header_refresh.startAnimation(donwnAnimation);
tv_header_status.setText("下拉刷新...");
break;
case RELEASE_REFRESH:// 手松刷新
iv_header_refresh.startAnimation(upAnimation);
tv_header_status.setText("手松刷新...");
break;
case REFRESHING: //正在刷新
iv_header_refresh.clearAnimation();
iv_header_refresh.setVisibility(View.GONE);//图片隐藏
tv_header_status.setText("正在刷新...");
pb_header_refresh.setVisibility(View.VISIBLE);
break;
}
}
7.手指离开屏幕的处理,回调接口,联网请求
public interface OnRefreshListener{
/** 当下拉刷新的时候回调这个方法 */ public void onPullDownRefresh();
}
private OnRefreshListener mOnRefreshListener;
public void setOnRefreshListener(OnRefreshListener l){ mOnRefreshListener = l; }
定义接口 1.在哪里定义接口,哪个地方需要回调就在哪里定义 public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); } 2.如果调用结构-在View中
public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }
其实就是 void onClick(View v);被回调
3.如何使用 -- 用户
ivheaderrefresh.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //当点击的时候会被回调 } });
8.当联网成功或者失败的时候,下拉刷新状态还原
加载更多
1.在构造方法里面初始化布局footerview.xml
view.setPadding(0,-控件的高,0,0);//完全隐藏
2.监听ListView的滚动,当滚动到最后一条的时候,加载更多
3.新增加加载更多的方法
public interface OnRefreshListener{
/** 当下拉刷新的时候回调这个方法 */ public void onPullDownRefresh();
/**
当上拉,并且滑动的最后一条数据的时候,回调这个方法 */ public void onLoadMore();
}
4.调用接口 //回调接口 if (onRefreshListener != null) { onRefreshListener.onLoadMore(); }
5.联网请求更多的数据,加载更多的请求的连接是一个新的了
6.把新得到的数据,加载到原来的ArrayList 集合中
isLoadMore = false;
//加载更多
news.addAll(detailPagerBean.getData().getNews());
adapter.notifyDataSetChanged();//适配器刷新
7.刷新,并且恢复初始状态
isLoadMore = false; footView.setPadding(0,-footViewHeight,0,0);
RefreshListView的使用步骤说明
本库介绍:作者
1.项目关联库
2.布局中使用
3.设置适配器
案例代码
package com.atguigu.refreshlistviewdemo;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.atguigu.refreshlistview.RefreshListView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MainActivity extends Activity {
private static final int PULL_DONW_REFRESH = 1;
private static final int LOADMORE = 2;
private RefreshListView refreshListView;
private ArrayList<String> strings;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
refreshListView = (RefreshListView) findViewById(R.id.refreshListView);
//准备数据
strings = new ArrayList<>();
for (int i = 0; i < 100; i++) {
strings.add(getsystemTime() + "-------" + i);
}
myAdapter = new MyAdapter();
//设置适配器
refreshListView.setAdapter(myAdapter);
refreshListView.setOnRefreshListener(new RefreshListView.OnRefreshListener() {
@Override
public void onPullDownRefresh() {
getDataFromNet();
}
@Override
public void onLoadMore() {
getMoreData();
}
});
}
private void getMoreData() {
new Thread() {
@Override
public void run() {
super.run();
//真正联网
SystemClock.sleep(2000);
for (int i = 0; i < 20; i++) {
strings.add(getsystemTime() + "---m----" + i);
}
handler.sendEmptyMessage(LOADMORE);
}
}.start();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case PULL_DONW_REFRESH:
myAdapter.notifyDataSetChanged();
refreshListView.onFinishRefresh(true);
break;
case LOADMORE:
myAdapter.notifyDataSetChanged();
refreshListView.onFinishRefresh(true);
break;
}
super.handleMessage(msg);
}
};
private void getDataFromNet() {
new Thread() {
@Override
public void run() {
super.run();
SystemClock.sleep(2000);
strings = new ArrayList<>();
for (int i = 0; i < 100; i++) {
strings.add(getsystemTime() + "---xxxxx----" + i);
}
handler.sendEmptyMessage(PULL_DONW_REFRESH);
}
}.start();
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return strings.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(MainActivity.this);
textView.setText(strings.get(position));
textView.setTextSize(30);
textView.setTextColor(Color.BLACK);
return textView;
}
}
private String getsystemTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
}