PullToRefreshListView 用法和ListView 没有什么区别 listview能用的属性 pulltorefresh也能用
我一直认为动手是最好的学习方法...
一:首先看布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- ptr:ptrAnimationStyle="flip" flip:翻转 rotate:旋转--> <!-- ptr:ptrShowIndicator="true" 右上角 右下角出现箭头--> <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/pullToRefresh" android:layout_width="match_parent" android:layout_height="wrap_content" ptr:ptrDrawable="@drawable/default_ptr_flip" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="#383838" ptr:ptrHeaderTextColor="#FFFFFF" /> </LinearLayout>
ptr:ptrDrawable=“” 上拉下拉图标
ptr:ptrAnimationStyle="" 图标动画 取值: flip:翻转 rotate旋转
ptr:ptrHeaderBackground="" 上拉下拉时 头部的背景色
ptr:ptrHeaderTextColor="" 上拉下拉时 文字颜色
还有一些常用属性
ptrRefreshableViewBackground 设置整个mPullRefreshListView的背景色
ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。
ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。
注:上述属性都可以代码添加,请用pullToRefresh.set查看
二:MainActivity代码
public class MainActivity extends ActionBarActivity { private PullToRefreshListView pullToRefresh; private List<PullBean> data = new ArrayList<PullBean>(); MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); pullToRefresh = (PullToRefreshListView) findViewById(R.id.pullToRefresh); data = getData(); adapter = new MyAdapter(this); pullToRefresh.setAdapter(adapter); /* * Mode.BOTH:同时支持上拉下拉 * Mode.PULL_FROM_START:只支持下拉Pulling Down * Mode.PULL_FROM_END:只支持上拉Pulling Up */ /* * 如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。 * 如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。 * 当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法, * Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法. */ pullToRefresh.setMode(Mode.BOTH); init(); /* * setOnRefreshListener(OnRefreshListener listener):设置刷新监听器; * setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器; * setOnPullEventListener(OnPullEventListener listener);设置事件监听器; * onRefreshComplete():设置刷新完成 */ /* * pulltorefresh.setOnScrollListener() */ // SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 // SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) // SCROLL_STATE_IDLE(0) 停止滚动 /* * setOnLastItemVisibleListener * 当用户拉到底时调用 */ /* * setOnTouchListener是监控从点下鼠标 (可能拖动鼠标)到放开鼠标(鼠标可以换成手指)的整个过程 ,他的回调函数是onTouchEvent(MotionEvent event), * 然后通过判断event.getAction()是MotionEvent.ACTION_UP还是ACTION_DOWN还是ACTION_MOVE分别作不同行为。 * setOnClickListener的监控时间只监控到手指ACTION_DOWN时发生的行为 */ pullToRefresh.setOnRefreshListener(new OnRefreshListener2<ListView>(){ @Override public void onPullDownToRefresh( PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub PullBean bean = new PullBean(); bean.setTitle("下拉刷新"); bean.setContent("我的神"); adapter.addFirst(bean); new FinishRefresh().execute(); adapter.notifyDataSetChanged(); } @Override public void onPullUpToRefresh( PullToRefreshBase<ListView> refreshView) { // TODO Auto-generated method stub PullBean bean = new PullBean(); bean.setTitle("上拉刷新"); bean.setContent("我的神"); adapter.addLast(bean); new FinishRefresh().execute(); adapter.notifyDataSetChanged(); } }); // pullToRefresh.setOnRefreshListener(new OnRefreshListener<ListView>() { // // @Override // public void onRefresh(PullToRefreshBase<ListView> refreshView) { // // TODO Auto-generated method stub // String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), // DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // // // Update the LastUpdatedLabel // refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // PullBean bean = new PullBean(); // bean.setTitle("我的神"); // bean.setContent("我的神"); // adapter.addFirst(bean); // new FinishRefresh().execute(); // } // // }); } private void init() { ILoadingLayout startLabels = pullToRefresh .getLoadingLayoutProxy(true, false); startLabels.setPullLabel("下拉刷新...");// 刚下拉时,显示的提示 startLabels.setRefreshingLabel("正在载入...");// 刷新时 startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示 ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy( false, true); endLabels.setPullLabel("上拉刷新...");// 刚下拉时,显示的提示 endLabels.setRefreshingLabel("正在载入...");// 刷新时 endLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示 // // 设置下拉刷新文本 // pullToRefresh.getLoadingLayoutProxy(false, true) // .setPullLabel("上拉刷新..."); // pullToRefresh.getLoadingLayoutProxy(false, true).setReleaseLabel( // "放开刷新..."); // pullToRefresh.getLoadingLayoutProxy(false, true).setRefreshingLabel( // "正在加载..."); // // 设置上拉刷新文本 // pullToRefresh.getLoadingLayoutProxy(true, false) // .setPullLabel("下拉刷新..."); // pullToRefresh.getLoadingLayoutProxy(true, false).setReleaseLabel( // "放开刷新..."); // pullToRefresh.getLoadingLayoutProxy(true, false).setRefreshingLabel( // "正在加载..."); } private List<PullBean> getData(){ List<PullBean> list = new ArrayList<PullBean>(); for(int i = 0;i < 10;i ++){ PullBean bean = new PullBean(); bean.setTitle("item " + i + " 搜索业务增速下滑 Google廉颇老矣?"); bean.setContent("Google于10月17日发布了2014年第三季度财报"); list.add(bean); } return list; } private class FinishRefresh extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... params) { try { Thread.sleep(1000); } catch (InterruptedException e) { } return null; } @Override protected void onPostExecute(Void result){ // adapter.notifyDataSetChanged(); pullToRefresh.onRefreshComplete(); } } private class MyAdapter extends BaseAdapter{ private LayoutInflater mInflater; public MyAdapter(Context context) { // TODO Auto-generated constructor stub mInflater = LayoutInflater.from(context); } public void addFirst(PullBean bean){ data.add(0, bean); } public void addLast(PullBean bean){ data.add(bean); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder = null; if(convertView == null){ viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.item, null); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.content = (TextView) convertView.findViewById(R.id.content); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.title.setText(data.get(position).getTitle()); viewHolder.content.setText(data.get(position).getContent()); return convertView; } class ViewHolder{ TextView title; TextView content; } } }
item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="#BA55D3" android:text="我的神"/> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14.0sp" android:layout_marginTop="5dp" android:textColor="#7CFC00" android:text="我的神"/> </LinearLayout>
Mode.BOTH:同时支持上拉下拉
Mode.PULL_FROM_START:只支持下拉Pulling Down
Mode.PULL_FROM_END:只支持上拉Pulling Up
也可以用 ptr:ptrMode="both"
可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发)
如果Mode设置成Mode.BOTH,需要设置刷新Listener为OnRefreshListener2,并实现onPullDownToRefresh()、onPullUpToRefresh()两个方法。
如果Mode设置成Mode.PULL_FROM_START或Mode.PULL_FROM_END,需要设置刷新Listener为OnRefreshListener,同时实现onRefresh()方法。
当然也可以设置为OnRefreshListener2,但是Mode.PULL_FROM_START的时候只调用onPullDownToRefresh()方法,Mode.PULL_FROM的时候只调用onPullUpToRefresh()方法.
如果想上拉、下拉刷新的时候 做一样的操作,那就用OnRefreshListener,上拉下拉的时候都调用
如果想上拉、下拉做不一样的的操作,那就在setOnRefreshListener时 用new OnRefreshListener2<ListView>
当然如果想自己设置上拉下拉中的文字 可以这样
ILoadingLayout startLabels = pullToRefresh .getLoadingLayoutProxy(true, false); startLabels.setPullLabel("下拉刷新...");// 刚下拉时,显示的提示 startLabels.setRefreshingLabel("正在载入...");// 刷新时 startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示 ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy( false, true); endLabels.setPullLabel("上拉刷新...");// 刚下拉时,显示的提示 endLabels.setRefreshingLabel("正在载入...");// 刷新时 endLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示
当然也可以这样
pullToRefresh.getLoadingLayoutProxy(false, true) .setPullLabel("上拉刷新..."); pullToRefresh.getLoadingLayoutProxy(false, true).setReleaseLabel( "放开刷新..."); pullToRefresh.getLoadingLayoutProxy(false, true).setRefreshingLabel( "正在加载..."); // 设置上拉刷新文本 pullToRefresh.getLoadingLayoutProxy(true, false) .setPullLabel("下拉刷新..."); pullToRefresh.getLoadingLayoutProxy(true, false).setReleaseLabel( "放开刷新..."); pullToRefresh.getLoadingLayoutProxy(true, false).setRefreshingLabel( "正在加载...");
setOnScrollListener()
SCROLL_STATE_TOUCH_SCROLL 正在滚动
SCROLL_STATE_FLING 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
SCROLL_STATE_IDLE 停止滚动
setOnLastItemVisibleListener
当用户拉到底时调用
setOnItemClickListener()
为pullToRefresh中每一个item设置事件
代码下载:点击下载代码
下拉上拉 图标和文字 位置改动是在PullToRefresh源代码中改的即:PullToRefreshListView.handleStyledAttributes 中lp的Gravity改为CENTER_VERTICAL
如果想要改动图标和文字的距离和布局 在这library项目下这两个文件改
pull_to_refresh_header_horizontal.xml
pull_to_refresh_header_vertical.xml
参考博客:
http://blog.csdn.net/lmj623565791/article/details/38238749
http://blog.csdn.net/harvic880925/article/details/17680305
谢谢原作者
持续更新ing MMjiajia132