在PullToRefresh基础上进行更改,对PullToRefreshBase文件的更改
protected void addRefreshableView(Context context, T refreshableView) {
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mHeader = (RelativeLayout) inflater.inflate(R.layout.refresh_header, null);
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
int height2 = mHeight = (int)context.getResources().getDimension(R.dimen.header_real_height);
// 创建一个包装容器
mRefreshableViewWrapper = new FrameLayout(context);
mRefreshableViewWrapper.addView(refreshableView, width, height);
mRefreshableViewWrapper.addView(mHeader, width, height2);
// 这里把Refresh view的高度设置为一个很小的值,它的高度最终会在onSizeChanged()方法中设置为MATCH_PARENT
// 这样做的原因是,如果此是它的height是MATCH_PARENT,那么footer得到的高度就是0,所以,我们先设置高度很小
// 我们就可以得到header和footer的正常高度,当onSizeChanged后,Refresh view的高度又会变为正常。
height = 10;
addView(mRefreshableViewWrapper, new LayoutParams(width, height));
}
主要是添加一个头部盖在listview上,
PullToRefreshListView
@Override
protected ListView createRefreshableView(final Context context, AttributeSet attrs) {
ListView listView = new ListView(context);
mListView = listView;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v2 = inflater.inflate(R.layout.refresh_header_item, null);
mListView.addHeaderView(v2);
listView.setOnScrollListener(this);
return listView;
}
创建时给listview加一个头部占位区
然后就是根据listview的onScroll放法对view进行动画
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (null != mScrollListener) {
mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
if(null != getmHeader()) {
int s = getScrollY(view);
ViewHelper.setTranslationY(getmHeader(), Math.max(-s, -Util.dip2px(getContext(),headerHeight)));
//取0 - 1之间数
float ratio = clamp(ViewHelper.getTranslationY(getmHeader()) / (-Util.dip2px(getContext(),headerHeight)), 0.0f, 1.0f);
//保持不动
if(ignoreViews.size() > 0){
for (int i = 0;i < ignoreViews.size();i ++){
interpolate(ignoreViews.get(i), ignoreViews.get(i), sSmoothInterpolator.getInterpolation(ratio));
}
}
//根据参照动
Iterator iter = interpolateViews.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
View key = (View) entry.getKey();
View val = (View) entry.getValue();
interpolate(key, val, sSmoothInterpolator.getInterpolation(ratio));
}
//透明度变化
if(alphaViews.size() > 0){
for(int i = 0 ; i < alphaViews.size() ; i ++){
setAlpha(alphaViews.get(i), ratio);
}
}
}
}
测试Activity
package com.dd.pullupandtorefresh;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
//刷新自定义组件
public PullToRefreshListView mPullListView;
private ListView mListView;
//刷新还是加载标识
//private boolean mIsStart = true;
//初始页数
//private int startPageNum = 1;
//下一次加载页数
//private int nextPageNum;
//每页数据数
private int perDataNum = 10;
//总共数据数
private int countDataNum = 0;
//是否还能加载更多
boolean hasMoreData = true;
private TextView tvHead;
private ArrayList<String> data;
private ArrayList<String> items;
ArrayAdapter arrayAdapter;
Integer[] params = new Integer[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPullListView = (PullToRefreshListView)findViewById(R.id.refresh_view);
mPullListView.setPullLoadEnabled(true);
mListView = mPullListView.getRefreshableView();
tvHead = (TextView) mPullListView.findViewById(R.id.header_text);
tvHead.setText("测试");
data = new ArrayList<String>();
items = new ArrayList<String>();
ImageView ivRight = (ImageView) mPullListView.findViewById(R.id.iv_right);
ImageView ivLeft = (ImageView) mPullListView.findViewById(R.id.iv_left);
TextView textView = (TextView) mPullListView.findViewById(R.id.title_text);
TextView test = (TextView) mPullListView.findViewById(R.id.test_text);
for(int i = 0;i < 105;i ++){
data.add("测试" + i);
if(i < 10){
items.add("测试" + i);
}
}
countDataNum = items.size();
mPullListView.setAlphaViews(test);
mPullListView.setIgnoreViews(ivLeft);
mPullListView.setInterpolateViews(tvHead,textView);
mPullListView.setAlphaAnimationViews(findViewById(R.id.iv_add));
modifyViews();
}
private void modifyViews() {
mListView = mPullListView.getRefreshableView();
arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,items);
mListView.setDivider(null);
mListView.setAdapter(arrayAdapter);
mPullListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
refresh();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
load();
}
});
}
private void refresh(){
//清空数据
items.clear();
//更新UI
arrayAdapter.notifyDataSetChanged();
//开始数 和 结尾数
params[0] = 0;
params[1] = countDataNum;
new RefreshDataTask().execute(params);
}
private void load(){
//开始数 和 结尾数
params[0] = countDataNum;
params[1] = countDataNum + perDataNum;
new RefreshDataTask().execute(params);
}
//模拟网络加载数据的 异步请求类
//
private class RefreshDataTask extends AsyncTask<Integer, Void, ArrayList<String>> {
//子线程请求数据
@Override
protected ArrayList<String> doInBackground(Integer... params) {
// Simulates a background job.
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
ArrayList<String> list = new ArrayList<String>();
int startData = params[0];
int endData = params[1];
if(endData > data.size()){
endData = data.size();
hasMoreData = false;
}else {
hasMoreData = true;
}
if(startData >= 0 && startData < endData){
for(int i = startData;i < endData; i++){
list.add(data.get(i));
}
}
return list;
}
//主线程更新UI
@Override
protected void onPostExecute(ArrayList<String> result) {
mPullListView.onPullDownRefreshComplete();
mPullListView.onPullUpRefreshComplete();
if(result != null && result.size() > 0){
items.addAll(result);
}
//
countDataNum = items.size();
arrayAdapter.notifyDataSetChanged();
mPullListView.setHasMoreData(hasMoreData);
super.onPostExecute(result);
}
}
}