先上图:类似于水滴的下拉刷新效果
Demo下载:点击打开链接(其中项目根目录下的circlerefresh就是该类库)。下面说说如何使用circlerefresh实现下拉刷新功能。
一。搭建工程:(这里以android studio开发环境为例)
下载Demo以获取circlerefresh库,将该库导入项目即可。
二。如何使用:
1.在布局文件中添加如下代码:
<com.tuesda.walker.circlerefresh.CircleRefreshLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
app:AniBackColor="#ff8b90af"
app:AniForeColor="#ffffffff"
app:CircleSmaller="6"
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView">
</ListView>
</com.tuesda.walker.circlerefresh.CircleRefreshLayout>
circlerefresh继承自FrameLayout,这里相当于将ListView控件放到circlerefreshLayout布局下.
2.在对应activity中:
声明控件,适配器,数据对象(跟使用普通的listView过程差不多,也可自定义适配器):
private CircleRefreshLayout circleRefreshLayout ;
private ListView listView ;
private ArrayList<String> lists ;
private ArrayAdapter<String> adapter ;
在onCreat()中实例化对象:
circleRefreshLayout = (CircleRefreshLayout)findViewById(R.id.refresh_layout) ;
listView = (ListView)findViewById(R.id.listView) ;
lists = new ArrayList<String>() ;
for(int i=0;i<10;i++)
{
lists.add(i+" ") ;
}
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,lists) ;
listView.setAdapter(adapter);
至此,运行项目就可以看到下拉刷新的动画效果了(用起来很简单粗暴啊!)
接下来使用hanlder+thread实现刷新逻辑。
首先调用下面的代码绑定circleRefreshLayout 的滑动监听器(note:这里不需要用上listView的监听事件)。
circleRefreshLayout.setOnRefreshListener(new CircleRefreshLayout.OnCircleRefreshListener() {
@Override
public void completeRefresh() {
//do something when completeRefresh
Toast.makeText(MainActivity.this, "refresh has complete", Toast.LENGTH_SHORT).show();
}
@Override
public void refreshing() {
//do something when Refreshing
Toast.makeText(MainActivity.this, "refreshing", Toast.LENGTH_SHORT).show();
}
});
定义一个handler处理刷新事件
private Handler myHandler = new Handler()
{
//接收子线程的信息
public void handleMessage(Message msg)
{
//根据接收的消息进行相关操作
}
} ;
定义一个实现Runnable的类,在run()方法内实现刷新内容加载操作(这里直接让子线程睡眠3秒),刷新操作执行完毕后,发送消息,以供主线程中的handler接收消息并进行处理。
private class MyRunnable implements Runnable
{
@Override
public void run() {
try {
Thread.sleep(3000);
lists.add(0,"100");
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message() ;
message.what = 0 ;
myHandler.sendMessage(message) ;
}
}
在Handler的handleMessage()方法(自动接收消息并进行相关处理)下添加代码:
switch(msg.what)
{
case 0:
circleRefreshLayout.finishRefreshing();
break ;
}
调用circleRefreshLayout.finishRefreshing()方法结束刷新,调用该方法后,会自动回调circleRefreshLayout监听器下的completeRefresh()方法。总的来说这里的逻辑就是开启子线程处理下拉刷新的耗时操作,完成后,handler接收消息,进而结束刷新过程。
在circleRefreshLayout监听器的refreshing()方法下启动子线程:(当有下拉操作时会自动调用这个方法)
public void refreshing() {
//do something when Refreshing
Toast.makeText(MainActivity.this, "refreshing", Toast.LENGTH_SHORT).show();
//启动子线程,三秒后停止刷新
MyRunnable myRunnable = new MyRunnable() ;
new Thread(myRunnable).start();
}
下拉操作完成后,在completeRefresh方法内刷新数据:
adapter.notifyDataSetChanged();
自此下拉刷新功能已全部完成,运行工程看看这个动画,还不错吧!(如果觉得动画时间过长,所占位置不适,颜色等balabala,可自行在circlerefresh下的AnimationView.java下进行修改。)