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


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


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值