在android的support.V4包中,提供了一个下拉刷新的控件:SwipeRefreshLayout。使用该控件可以实现知乎上的下拉刷新效果。首先来看一下这个类的继承关系。
从这个继承关系,可以看到SwipeRefreshLayout是一个ViewGroup,这个ViewGroup只有一个子view,便是我们需要刷新的控件。下面是一个简单的例子演示一下如何使用该控件。
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
主actiivty.java
package com.gearmotion.app.swiperefreshlayoutmotion;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
//使用butterknife这个框架来初始化view,可以省去一系列的findeviewbyId()方法的调用
@Bind(R.id.swiperefresh)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.listview)
ListView mListView;
private List<String> mData;
private ArrayAdapter<String> mAdapter;
private static final int FLAG = 0x01;
private Handler mHandler = new Handler() {
@Override
public void dispatchMessage(Message msg) {
int what = msg.what;
if (what == FLAG) {
mData.add("fruit");
mAdapter.notifyDataSetChanged();
//处理完事物之后必须调用该函数,取消加载动画
mSwipeRefreshLayout.setRefreshing(false);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
bindData();
}
private void initData() {
mData = new ArrayList<String>();
mData.add("apple");
mData.add("pear");
mData.add("watermelon");
mData.add("orange");
mData.add("banana");
}
private void bindData() {
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
android.R.id.text1, mData);
mListView.setAdapter(mAdapter);
//设置监听事件
mSwipeRefreshLayout.setOnRefreshListener(this);
}
@Override
public void onRefresh() {
Message msg = Message.obtain();
msg.what = FLAG;
//延长动画效果
mHandler.sendMessageDelayed(msg, 4000);
}
}
实现的效果如下: