今天有空学习了一下 PullToRefresh 这个开源控件的使用方法,功能很强大,效果也是不错,封装了 ListView, GirdView, ScrollView等常用控件
同时也参考了鸿洋老师关于该控件的博客 ,写的很详细。 自己也记一篇当作学习笔记吧。
首先去那哥们儿github 下载下他的项目,把他的library 导入到自己项目里,关于如何在android studio里导入 library 我今天也是突然忘了。。。还是不熟悉,所以想把这个步骤写在这儿,牢固一下记忆;
1.准备好项目要用的library
2.在自己的项目下 File->New->Import Module
3.选择 要导入的 library ,导入后可以 对导入的 module 重命名,最后点击 finish;
4.在自己 app 的 build.gradle文件里 添加依赖
5.然后就可以在自己工程里面使用啦
OK, 既然已经导入PullToRefresh 的 相关 library;那就开始吧
先说ListView:
布局文件:
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="#19000000"
android:dividerHeight = "4dp"
android:fadingEdge="none"
>
</com.handmark.pulltorefresh.library.PullToRefreshListView>
封装好了直接用;
下面看一下MainActivity里的代码:
public class MainActivity extends AppCompatActivity {
private LinkedList<String> mListItems;
private ArrayAdapter<String> mAdapter;
private int mItemCount = 9;
private PullToRefreshListView pullToRefreshListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//girdView
//setContentView(R.layout.pulltorefresh_gridview_layout);
pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
initData();
//ListView
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);
//GridView
//mAdapter = new ArrayAdapter<String>(this,R.layout.gridview_item_layout,R.id.id_grid_item_text ,mListItems);
pullToRefreshListView.setAdapter(mAdapter);
//仅支持下拉刷新
pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
//仅支持上拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
//支持上拉,下拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
//禁用下拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.DISABLED);
//仅支持手动
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.MANUAL_REFRESH_ONLY);
ILoadingLayout startLabels = pullToRefreshListView.getLoadingLayoutProxy();
startLabels.setPullLabel("start");
startLabels.setRefreshingLabel("ing");
startLabels.setReleaseLabel("end");
//下拉时显示的 icon
startLabels.setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher));
//单向刷新
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.
OnRefreshListener<ListView>(){
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView){
String label = DateUtils.formatDateTime(getApplicationContext(),
System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME|
DateUtils.FORMAT_SHOW_DATE|
DateUtils.FORMAT_ABBREV_ALL);
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
new GetDataTask().execute();
}
});
//双向刷新
// pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.
// OnRefreshListener2<ListView>() {
// @Override
// public void onPullDownToRefresh(PullToRefreshBase<ListView>refreshView){
//
// String label = DateUtils.formatDateTime(getApplicationContext(),
// System.currentTimeMillis(),
// DateUtils.FORMAT_SHOW_TIME|
// DateUtils.FORMAT_SHOW_DATE|
// DateUtils.FORMAT_ABBREV_ALL);
// refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
//
// new GetDataTask().execute();
// }
//
// @Override
// public void onPullUpToRefresh(PullToRefreshBase<GridView> refreshView){
//
// new GetDataTask().execute();
// }
// });
}
private void initData(){
mListItems = new LinkedList<String>();
for(int i = 0; i< mItemCount; i ++){
mListItems.add("" + i);
}
}
private class GetDataTask extends AsyncTask<Void , Void, String>{
@Override
protected String doInBackground(Void... params) {
try{
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
mListItems.add("" + mItemCount++);
mAdapter.notifyDataSetChanged();
pullToRefreshListView.onRefreshComplete();
}
}
}
代码的各个部分都是很容易理解的,我也加上了相应的注释,就不赘述了,这里主要说一下底下这个函数:
pullToRefreshListView.setOnRefreshListener
这个函数的功能作用在于让使用者定义 控件在刷新时要做的事儿,demo中是希望在refresh是异步更新 ListView的数据,并且利用
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
这句给刷新提示区绘制当前刷新时间戳;我们看到 pullToRefreshListView.setOnRefreshListener可以有两种类型的参数,一种是
new PullToRefreshBase.OnRefreshListener<ListView>()
下的回调函数 onRefresh(); 另一种是
new PullToRefreshBase.OnRefreshListener2<ListView>()
下的回调函数 onPullDownToRefresh() 和 onPullUpToRefreshBase();
具体调用哪个是依据这里:
//仅支持下拉刷新
pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
//仅支持上拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
//支持上拉,下拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
//禁用下拉刷新
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.DISABLED);
//仅支持手动
//pullToRefreshListView.setMode(PullToRefreshBase.Mode.MANUAL_REFRESH_ONLY);
显然当 setMode 为 BOTH时,就该调用调用下面那个来分别设置 下拉和 上拉 时内容啦~~
这里就 讲了 listView 相关,GridView 实现起来如出一辙,稍后上传自己的小demo,需要学习的可以一起哈~~
我也是个正在努力的小白,一起加油加油~