前言
Android下拉刷新、上拉加载是一个常见的功能,但是Google推出了一个下拉刷新的官方控件—SwipeRefreshLayout之后,就没有了音信,对于使用者确实是个烦恼。
今天我给大家讲解一下使用SwipeRefreshLayout完成下拉刷新,及简单实现上拉加载功能,如果后续有时间,可能会重写一下这个控件。
使用SwipeRefreshLayout实现下拉刷新
首先在布局中加入SwipeRefreshLayout(布局下只能加一个控件):
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:listSelector="@android:color/transparent"
android:scrollbars="none"
/>
</android.support.v4.widget.SwipeRefreshLayout>
SwipeRefreshLayout里边可以放ListView、GridView、ScrollView、TextView等等控件。
Activity中添加下拉刷新的监听方法:
srl = (SwipeRefreshLayout) findViewById(R.id.srl);
srl.setColorSchemeColors(Color.RED, Color.BLUE, Color.YELLOW);
srl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
{
@Override
public void onRefresh()
{
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
data.add("aaa");
mAdapter.notifyDataSetChanged();
srl.setRefreshing(false);
}
}, 1000);
}
});
setColorSchemeColors可以设置等待条的颜色,在onRefresh中实现你的刷新操作,别忘了setRefreshing(false)结束刷新操作。
简单实现上拉加载
简单实现:在lisview最下面一个item呈现在用户面前的时候,自动加载下一页。
首先为listView添加滚动监听list.setOnScrollListener(),主要是修改onScroll方法。这里在上拉操作的时候我们可以分为这几种情况:
(一)数据未填充满整个屏幕
1.数据不够一页,这种情况,listview当让不用上拉加载了,因为第一页数据都没满。
2.数据够一页,但是convertView高度不够填充屏幕,这个时候,我们可以继续加载下一页。
(二)数据填充满了整个屏幕
1.未滚动到最下面一个item,那么正常滚动。
2.已滚动到最下面一个item,那么加载下一页。
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
Log.i("aaa", "firstVisibleItem=" + firstVisibleItem + " visibleItemCount=" + visibleItemCount + " totalItemCount=" + totalItemCount);
if(isLoading)
{
return ;
}
// 假设一页10条数据 这里不够一页的数据
if (totalItemCount < 10*page)
{
return;
}
// 最下面item未出现,正常滚动
if (totalItemCount < visibleItemCount)
{
return;
}
// 当最下面一个item出现的时候,加载下一页
if (firstVisibleItem + visibleItemCount >= totalItemCount)
{
isLoading = true;
Toast.makeText(MainActivity.this, "加载更多", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
data.add("bbb");
data.add("ccc");
data.add("ddd");
mAdapter.notifyDataSetChanged();
isLoading = false;
}
}, 2000);
}
}
这里需要注意的是,最后一个item出现的时候,是自动加载,此时onScroll还一直在被调用,我在加载下一页的时候,肯定不想重复加载,所以用isLoading变量来记录是否在加载中。
本人技术比较渣,有问题欢迎指正,以后有时间,可能会修改SwipeRefreshLayout源代码。