您的位置:首页 > 其它

上推动画下拉刷新上拉加载

2016-01-07 11:18 357 查看


在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);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: