之前有一段时间没写博客了,忙课程设计用了一周,搞其他有的没的也浪费了很多时间..
惭愧惭愧..这两天整理了一下listview的下拉刷新和上拉加载的使用方法,自己做了一遍以后感觉受益良多,也慢慢积累了一些以前没有掌握的知识点。
本文分成两个部分:
1:采用PullToRefresh实现listview的下拉刷新和上拉加载
2:自定义listview实现下拉刷新和上拉记载
一:PullToRefresh实现
用到的是chrisbanes大神写的实现下拉刷新和上拉加载的类库PullToRefresh,目前支持的控件类型有listview,gridview,scrollview,viewpager,webview等我们经常接触到的控件。
下载地址:https://github.com/chrisbanes/Android-PullToRefresh
这里要注意导入过程:下好以后将Android-PullToRefresh-master类库包里的library包和你的项目导入在同一个workspace下,然后引入这个library包即可。
具体使用步骤比较简单,参考下列代码:
public class MainActivity extends ListActivity { private LinkedList<String> mItemList; private ArrayAdapter<String> adapter; private Context context; private PullToRefreshListView mPullToRefreshListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; initData(); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mItemList); //初始化控件 mPullToRefreshListView = (PullToRefreshListView)findViewById(R.id.pull_refresh_list); ListView mListView = mPullToRefreshListView.getRefreshableView(); mListView.setAdapter(adapter); //设置pull-to-refresh模式为Mode.Both mPullToRefreshListView.setMode(Mode.BOTH); //设置上拉下拉事件 mPullToRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(final PullToRefreshBase<ListView> refreshView) { if (refreshView.isHeaderShown()){ Toast.makeText(context, "下拉刷新",Toast.LENGTH_SHORT).show(); //下拉刷新 业务代码 }else { Toast.makeText(context, "上拉加载更多",Toast.LENGTH_SHORT).show(); //上拉加载更多 业务代码 } refreshView.postDelayed(new Runnable() { @Override public void run() { refreshView.onRefreshComplete(); } }, 1000); Toast.makeText(context, "刷新成功",Toast.LENGTH_SHORT).show(); } }); } private void initData(){ //初始化数据 mItemList = new LinkedList<String>(); mItemList.addAll(Arrays.asList(data)); } private String[] data = new String[]{"data1","data2","data3","data4","data5","data6", "data1","data2","data3","data4","data5","data6"}; }
按步骤完成以后运行的程序在上拉加载和下拉刷新的时候是不会停止的,因为在onRefresh类里面还没有写具体的实现业务代码:
@Override public void onRefresh(final PullToRefreshBase<ListView> refreshView) { if (refreshView.isHeaderShown()){ Toast.makeText(context, "下拉刷新",Toast.LENGTH_SHORT).show(); //下拉刷新 业务代码 }else { Toast.makeText(context, "上拉加载更多",Toast.LENGTH_SHORT).show(); //上拉加载更多 业务代码 }
这里为了能够方便测试,给其添加了测试代码,使用view的postDelayed()方法里实现定时停止操作,整个事件方法如下:
//设置上拉下拉事件 mPullToRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(final PullToRefreshBase<ListView> refreshView) { if (refreshView.isHeaderShown()){ Toast.makeText(context, "下拉刷新",Toast.LENGTH_SHORT).show(); //下拉刷新 业务代码 }else { Toast.makeText(context, "上拉加载更多",Toast.LENGTH_SHORT).show(); //上拉加载更多 业务代码 } refreshView.postDelayed(new Runnable() { @Override public void run() { refreshView.onRefreshComplete(); } }, 1000); Toast.makeText(context, "刷新成功",Toast.LENGTH_SHORT).show(); } });
以上就是使用PullToRefresh实现上拉加载和下拉刷新的过程。当然我们在使用的时候也不能光是“拿来主义”,就像最近看过一句令人印象深刻的话:别人造的轮子虽然好,自己如果不跟着做一遍永远也造不出轮子。
二:自定义listview实现
具体的实现思路是:
1、自定义listview,自定义headerview,添加到自定义的listview中,设置headerview默认状态下隐藏不可见。
2、在自定义的listview中通过引入OnScrollListener接口,在重写的方法里判断当前listview滚动的页码并记录下来。
3、自定义一个onMove方法判断移动过程中的操作,获得当前用户操作状态的state。重写onTouchEvent()方法,判断用户的四种动作:MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_UP并做出相应操作(如果在listview第一页且listview被下拉到并且state的值为“释放下拉操作”时调用mainactivity的刷新方法进行刷新,从而实现功能。
这里要注意从自定义mainactivity调用activity的刷新方法是通过activity引入自定义的listview中定义的接口,在mainactivity初始化的时候通过将自身实例this传入这个自定义的listview,从而实现的。
个人觉得还有另外一种方法可以实现,在mainactivity里创建一个public的静态实例对象,然后在listview中引入这个对象调用mainactivity的刷新方法,我也不知道这两种方法哪种好用一点望有大神告知~!!
下面是自定义listview实现下拉刷新的源代码,上拉加载同理可实现。