package com.tekinarslan.material.sample.customui;
import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
public class SwipeRefreshLayoutLoad extends SwipeRefreshLayout {
private int mTouchSlop;
private ListView mListView;
private OnLoadListener mOnLoadListener;
private View mListViewFooter;
private int mYDown;
private int mLastY;
private boolean isLoading = false;
public SwipeRefreshLayoutLoad(Context context) {
this(context, null);
}
public SwipeRefreshLayoutLoad(Context context, AttributeSet attrs) {
super(context, attrs);
}
//set the footer of the ListView with a ProgressBar in it
public void setFooterView(Context context, ListView mListView, int layoutId) {
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mListViewFooter = LayoutInflater.from(context).inflate(layoutId, null,
false);
mListView.addFooterView(mListViewFooter);
mListView.setFooterDividersEnabled(false);
this.mListView = mListView;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mYDown = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
mLastY = (int) event.getRawY();
if (isPullingUp())
//you can add view or hint here when pulling up the ListView
break;
case MotionEvent.ACTION_UP:
if (canLoad()) {
loadData();
}
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
private boolean canLoad() {
return isBottom() && !isLoading && isPullingUp();
}
private boolean isBottom() {
if (mListView.getCount() > 0) {
if (mListView.getLastVisiblePosition() == mListView.getAdapter().getCount() - 1 &&
mListView.getChildAt(mListView.getChildCount() - 1).getBottom() <= mListView.getHeight()) {
return true;
}
}
return false;
}
private boolean isPullingUp() {
return (mYDown - mLastY) >= mTouchSlop;
}
private void loadData() {
if (mOnLoadListener != null) {
setLoading(true);
mOnLoadListener.onLoad();
}
}
public void setLoading(boolean loading) {
isLoading = loading;
if (isLoading) {
if (isRefreshing()) setRefreshing(false);
if (mListView.getFooterViewsCount() == 0) {
mListView.addFooterView(mListViewFooter);
mListView.setSelection(mListView.getAdapter().getCount() - 1);
} else {
mListViewFooter.setVisibility(VISIBLE);
//mListView.addFooterView(mListViewFooter);
}
} else {
if (mListView.getAdapter() instanceof HeaderViewListAdapter) {
mListView.removeFooterView(mListViewFooter);
} else {
mListViewFooter.setVisibility(View.GONE);
}
mYDown = 0;
mLastY = 0;
}
}
public void setOnLoadListener(OnLoadListener loadListener) {
mOnLoadListener = loadListener;
}
public static interface OnLoadListener {
public void onLoad();
}
}