最近越来越多的客户端上使用上谷歌推荐的下拉刷新,效果如下:
这里是一个简单的下拉刷新+listview配合使用的。
首先看xml布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<korean.swipeorefreshlayoutgoogle.RefreshLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/refresh_widget"
>
<ListView
android:divider="@null"
android:dividerHeight="0dp"
android:fadingEdge="none"
android:overScrollMode="never"
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</korean.swipeorefreshlayoutgoogle.RefreshLayout>
</LinearLayout>
这个RefreshLayout是继承SwipeRefreshLayout的,代码如下:
public class RefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {
private View mListViewFooter;
private ListView mListView;
private RecyclerView mRecyclerView;
private boolean isLoading = false;
private OnLoadListener mLoadListener;
public int lastIndex = 0;
public RefreshLayout(Context context) {
super(context);
}
public RefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mListViewFooter = LayoutInflater.from(context).inflate(R.layout.listview_footer, null, false);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mListView == null) {
getListView();
}
}
private void getListView() {
int childs = getChildCount();
if (childs > 0) {
View childView = getChildAt(0);
if (childView instanceof ListView) {
mListView = (ListView) childView;
mListView.setOnScrollListener(this);
} else if (childView instanceof RecyclerView) {
mRecyclerView = (RecyclerView) childView;
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//判断是否到了底部,并且不是在加载数据的状态
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
lastIndex = linearLayoutManager.findLastVisibleItemPosition()+1;
Log.d("TAG" ,"linearLayoutManager.findLastVisibleItemPosition():"+linearLayoutManager.findLastCompletelyVisibleItemPosition());
if(linearLayoutManager.findLastVisibleItemPosition() == 19 && isLoading == false){
//首先设置加载状态
setLoading(true,true);
//调用加载更多的方法
mLoadListener.onLoadMore();
}
}
});
}
}
}
public void setLoading(boolean loading) {
this.isLoading = loading;
if (isLoading) {
mListView.addFooterView(mListViewFooter);
} else {
mListView.removeFooterView(mListViewFooter);
}
}
public void setLoading(boolean loading,boolean flag) {
this.isLoading = loading;
if (isLoading) {
mRecyclerView.addView(mListViewFooter,20);
//mListView.addFooterView(mListViewFooter);
} else {
mRecyclerView.removeViewAt(20);
//mListView.removeFooterView(mListViewFooter);
}
}
public void setOnLoadListener(OnLoadListener loadListener) {
this.mLoadListener = loadListener;
}
// 加载更多的接口
public interface OnLoadListener {
public void onLoadMore();
}
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
//判断是否到了底部,并且不是在加载数据的状态
if (mListView.getLastVisiblePosition() == mListView.getAdapter().getCount() - 1
&& isLoading == false) {
//首先设置加载状态
setLoading(true);
//调用加载更多的方法
mLoadListener.onLoadMore();
}
}
因为要监听加载更多嘛,我这里采用的是 监听listview滚动,当滚动到底部时,让footView显示,然后调用loadMore方法。
使用时,直接设置加载更多监听即可:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
mRefreshLayout = (RefreshLayout) findViewById(R.id.refresh_widget);
mList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
mList.add(String.valueOf(i));
}
adapter = new SampleAdapter(this, R.layout.list_item, mList);
listView.setAdapter(adapter);
//调整那个下拉刷新距离顶部的距离
//mRefreshLayout.setProgressViewEndTarget(true,400);
//设置中间圈圈的颜色
mRefreshLayout.setColorSchemeColors(Color.parseColor("#2B91D8"));
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
Log.d("TAG", "正在刷新");
//刷新2s后停止刷新
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mRefreshLayout.setRefreshing(false);
}
}, 2000);
}
});
mRefreshLayout.setOnLoadListener(new RefreshLayout.OnLoadListener() {
@Override
public void onLoadMore() {
if(mList.size() >= 30){
mRefreshLayout.setLoading(false);
return;
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 20; i < 30; i++) {
mList.add(String.valueOf(i));
}
mRefreshLayout.setLoading(false);
adapter.notifyDataSetChanged();
}
},3000);
}
});
//设置正在刷新
//mRefreshLayout.setRefreshing(true);
}
class SampleAdapter extends ArrayAdapter<String> {
private final LayoutInflater mInflater;
private final List<String> mData;
public SampleAdapter(Context context, int layoutResourceId, List<String> data) {
super(context, layoutResourceId, data);
mData = data;
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item, parent, false);
viewHolder.tvNum = (TextView) convertView.findViewById(R.id.tv_num);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvNum.setText(mData.get(position));
return convertView;
}
class ViewHolder {
TextView tvNum;
}
}
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, parent, false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv_num);
}
}
}