上推动画下拉刷新上拉加载
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); } } }
相关文章推荐
- android 去掉标题栏和全屏,横竖屏强制转换
- Android 版本更新
- 【c/c++】类模板
- Android之TextView(控件)
- linux桌面与命令模式切换
- css:选择器
- jQuery表格插件datatables用法详解
- 邮件开发:一些常见邮箱的POP3及SMTP服务器地址
- 一家大型公司的nginx配置
- 实践自定义UI-ViewGroup
- 如何在浏览器控制台(console)里输出彩色样式调试信息
- Ext: 由于出现错误 80020101 而导致此项操作无法完成。
- 1000以内所有的完数
- Mybatis配置文件
- linux mac下使用sed a\追加文本
- Xcode 各个版本下载地址
- codevs1080 第一次用ZKW线段树
- 单片机上电后内部发生的事情
- [leetcode] 206. Reverse Linked List 解题报告
- 第五篇 基于.net搭建热插拔式web框架(拦截器---请求管道)