这个控件在supportV4就提供了,叫做SwipeRefreshLayout。这个view其实就是一个父控件,我们可以如下定义。
在这强调一点这是5.0以下可能会出现问题
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
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:padding="16dp" />
</android.support.v4.widget.SwipeRefreshLayout>
有没有感觉它和listview一毛钱关系都没有!就是这么方便,比之前的listview下拉刷新要简单多了。用户只要在这个控件的范围里下拉,就会自动出现下拉的圆形小球。在实际使用中,我们还是需要在java代码中进行简单处理的。
而且你还可以用来刷新一些其他东西
首先设置一些属性
mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
mSwipeLayout.setOnRefreshListener(this);
// 设置下拉圆圈上的颜色,蓝色、绿色、橙色、红色
mSwipeLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);
mSwipeLayout.setDistanceToTriggerSync(400);// 设置手指在屏幕下拉多少距离会触发下拉刷新
mSwipeLayout.setProgressBackgroundColor(R.color.red);
mSwipeLayout.setSize(SwipeRefreshLayout.LARGE);
下面是刷新成功的监听
/*
* 监听器SwipeRefreshLayout.OnRefreshListener中的方法,当下拉刷新后触发
*/
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
list.removeAll(list);
list.add("weibo: googdev");
list.add("My GitHub: stormzhang");
list.add("Love Open Source");
list.add("An Android Developer");
list.add("This is stormzhang");
list.add("Hello");
arrayAdapter.notifyDataSetChanged();
// 停止刷新
mSwipeLayout.setRefreshing(false);
}
}, 5000); // 5秒后发送消息,停止刷新
}
下面贴出全部
package com.example.admin.xiala5;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout mSwipeLayout;
private ListView mListView;
private ArrayList<String> list = new ArrayList<String>();
ArrayAdapter arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
arrayAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData());
mListView.setAdapter(arrayAdapter);
mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
mSwipeLayout.setOnRefreshListener(this);
// 设置下拉圆圈上的颜色,蓝色、绿色、橙色、红色
mSwipeLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);
mSwipeLayout.setDistanceToTriggerSync(400);// 设置手指在屏幕下拉多少距离会触发下拉刷新
mSwipeLayout.setProgressBackgroundColor(R.color.red);
mSwipeLayout.setSize(SwipeRefreshLayout.LARGE);
}
private ArrayList<String> getData() {
list.add("Hello");
list.add("This is stormzhang");
list.add("An Android Developer");
list.add("Love Open Source");
list.add("My GitHub: stormzhang");
list.add("weibo: googdev");
return list;
}
/*
* 监听器SwipeRefreshLayout.OnRefreshListener中的方法,当下拉刷新后触发
*/
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
list.removeAll(list);
list.add("weibo: googdev");
list.add("My GitHub: stormzhang");
list.add("Love Open Source");
list.add("An Android Developer");
list.add("This is stormzhang");
list.add("Hello");
arrayAdapter.notifyDataSetChanged();
// 停止刷新
mSwipeLayout.setRefreshing(false);
}
}, 5000); // 5秒后发送消息,停止刷新
}
}
上面只有刷新,那么加载呢,这里加载我们可以另写与这个关系不大了,但是好事成双我就写下吧。
直接贴代码了哈
package com.example.admin.xiala5;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import static com.example.admin.xiala5.R.id.listview;
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout mSwipeLayout;
private ListView mListView;
private ArrayList list = new ArrayList();
ArrayAdapter arrayAdapter;
RelativeLayout id_rl_loading;
ProgressBar id_pull_to_refresh_load_progress;
TextView id_pull_to_refresh_loadmore_text;
boolean isLastItem = false;//是否是最后一项
boolean isLoading = false;//是否正在加载中
boolean isComp = false;//标记一次是否加载完成
int temp_data_count_page = 0;//临时存放当前加载页对应的pos
int data_count_page_all = 2;//模拟一共3页数据
final String loading_Load_More = "加载中...";
final String comp_Load_More = "加载完成";
String nowNormalText = "";//存放当前footview显示的文字
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(listview);
arrayAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData());
mListView.setAdapter(arrayAdapter);
mListView.setOnScrollListener(OnScrollListenerOne);
mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
mSwipeLayout.setOnRefreshListener(this);
// 设置下拉圆圈上的颜色,蓝色、绿色、橙色、红色
mSwipeLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
android.R.color.holo_orange_light, android.R.color.holo_red_light);
mSwipeLayout.setDistanceToTriggerSync(400);// 设置手指在屏幕下拉多少距离会触发下拉刷新
mSwipeLayout.setProgressBackgroundColor(R.color.red);
mSwipeLayout.setSize(SwipeRefreshLayout.LARGE);
//底部设置
View listview_footer_view = LayoutInflater.from(this).inflate(R.layout.listview_footer, null);
id_rl_loading = (RelativeLayout) listview_footer_view.findViewById(R.id.id_rl_loading);
id_pull_to_refresh_load_progress = (ProgressBar) listview_footer_view.findViewById(R.id.id_pull_to_refresh_load_progress);
id_pull_to_refresh_load_progress.setVisibility(View.GONE);
id_pull_to_refresh_loadmore_text = (TextView) listview_footer_view.findViewById(R.id.id_pull_to_refresh_loadmore_text);
id_pull_to_refresh_loadmore_text.setClickable(false);
mListView.addFooterView(listview_footer_view);
}
private ArrayList<String> getData() {
list.add("Hello");
list.add("This is stormzhang");
list.add("An Android Developer");
list.add("Love Open Source");
list.add("My GitHub: stormzhang");
list.add("weibo: googdev");
return list;
}
/*
* 监听器SwipeRefreshLayout.OnRefreshListener中的方法,当下拉刷新后触发
*/
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
list.removeAll(list);
list.add("Hello");
list.add("This is stormzhang");
list.add("An Android Developer");
list.add("Love Open Source");
list.add("My GitHub: stormzhang");
list.add("weibo: googdev");
temp_data_count_page=0;
mListView.setAdapter(arrayAdapter);
// 停止刷新
mSwipeLayout.setRefreshing(false);
}
}, 5000); // 5秒后发送消息,停止刷新
}
/**
* 上拉加载1
*/
AbsListView.OnScrollListener OnScrollListenerOne = new AbsListView.OnScrollListener() {
//正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调
//回调顺序如下
//第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
//第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
//第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//当滚到最后一行且停止滚动时,执行加载
if (isLastItem && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && !isLoading) {
//加载元素
loadMore();
isLastItem = false;
}
}
//滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
//firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
//visibleItemCount:当前能看见的列表项个数(小半个也算)
//totalItemCount:列表项共数
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//判断是否滚到最后一行
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
isLastItem = true;
}
}
};
//加载逻辑
private void loadMore() {
id_rl_loading.setVisibility(View.VISIBLE);
id_pull_to_refresh_loadmore_text.setText(loading_Load_More);
id_pull_to_refresh_loadmore_text.setClickable(false);
id_pull_to_refresh_load_progress.setVisibility(View.VISIBLE);
isLoading = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
loadData();
}
}, 3 * 1000);
}
//模拟加载数据
private void loadData() {
isLoading = false;
Log.i("XXX", "loadData");
if (temp_data_count_page < data_count_page_all) {//模拟加载完成了
for (int i = 0; i < 15; i++) {
list.add("More" + i);
}
temp_data_count_page++;
id_pull_to_refresh_loadmore_text.setText(nowNormalText);
isComp = false;
id_pull_to_refresh_loadmore_text.setClickable(true);
} else {
isComp = true;
id_pull_to_refresh_loadmore_text.setClickable(false);
id_pull_to_refresh_loadmore_text.setText(comp_Load_More);
Toast.makeText(MainActivity.this,"没有数据",Toast.LENGTH_SHORT).show();
}
id_pull_to_refresh_load_progress.setVisibility(View.GONE);
arrayAdapter.notifyDataSetChanged();
}
}
这里先这样。。。有空我把他封装成listview