package com.ywwxhz.widget;
import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.pnikosis.materialishprogress.ProgressWheel;
import com.ywwxhz.cnbetareader.R;
public class PagedLoader extends DataSetObserver implements OnScrollListener, OnClickListener {
private TextView normalTextView;
private TextView finallyTextView;
private ListAdapter adapter;
private ListView listView;
private ProgressWheel progressBar;
// ListView底部View
private View moreView;
// 最后可见条目的索引
private int lastVisibleIndex;
private OnLoadListener mOnLoadListener;
private OnScrollListener mOnScrollListener;
private boolean enable;
private boolean isLoading;
private boolean isFinally = false;
private Mode mode = Mode.AUTO_LOAD;
private PagedLoader() {
}
public void setOnLoadListener(OnLoadListener mOnLoadListener) {
this.mOnLoadListener = mOnLoadListener;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 计算最后可见条目的索引
lastVisibleIndex = firstVisibleItem + visibleItemCount;
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 滑到底部后自动加载,判断listview已经停止滚动并且最后可视的条目等于adapter的条目
if (enable && mode == Mode.AUTO_LOAD &&!isLoading&& scrollState == OnScrollListener.SCROLL_STATE_IDLE
&& lastVisibleIndex == listView.getAdapter().getCount()) {
if (mOnLoadListener != null) {
setLoading(true);
mOnLoadListener.onLoading(this, true);
}
}
if (mOnScrollListener != null) {
mOnScrollListener.onScrollStateChanged(view, scrollState);
}
}
public static Builder from(ListView listView) {
return new Builder(listView);
}
public boolean isLoading() {
return isLoading;
}
public void setLoading(boolean isloading) {
if(enable) {
isLoading = isloading;
if (isloading) {
progressBar.spin();
progressBar.setVisibility(View.VISIBLE);
normalTextView.setVisibility(View.GONE);
} else {
progressBar.stopSpinning();
normalTextView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
}
}
@Override
public void onClick(View v) {
if (enable && mode == Mode.CLICK_TO_LOAD) {
setLoading(true);
mOnLoadListener.onLoading(this, false);
}
}
public CharSequence getLoadingText() {
return normalTextView.getText();
}
public CharSequence getFinallyText() {
return finallyTextView.getText();
}
public void setNormalText(CharSequence title) {
normalTextView.setText(title);
}
public void setNormalText(int res) {
normalTextView.setText(res);
}
public void setFinallyText(CharSequence text) {
finallyTextView.setText(text);
}
public void setFinallyText(int res) {
finallyTextView.setText(res);
}
public void setFinally() {
if(enable) {
isFinally = true;
setLoading(false);
normalTextView.setVisibility(View.GONE);
finallyTextView.setVisibility(View.VISIBLE);
enable = false;
}
}
public void onChanged() {
if (this.adapter == null) {
throw new RuntimeException("must set adapter after notifyDataSetChanged");
}
blindEvent();
}
public void onInvalidated() {
onChanged();
}
public ListAdapter getAdapter() {
return adapter;
}
public void setAdapter(ListAdapter adapter) {
if(this.adapter == null && adapter == null){
throw new IllegalArgumentException("adapter not to be null");
}
if(this.adapter != null) {
this.adapter.unregisterDataSetObserver(this);
}
this.adapter = adapter;
this.adapter.registerDataSetObserver(this);
this.listView.setAdapter(adapter);
blindEvent();
}
private void blindEvent(){
if (adapter.getCount() == 0) {
setEnable(false);
} else {
// 判断是否绑定事件,如果没有任何事件绑定,不显示foot
if (mOnLoadListener == null) {
setEnable(false);
} else {
if(!isFinally) {
setEnable(true);
}
}
}
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
if (enable&&isFinally) {
normalTextView.setVisibility(View.VISIBLE);
finallyTextView.setVisibility(View.GONE);
isFinally = false;
}
setupFootView();
}
private void setupFootView(){
if (enable) {
moreView.setVisibility(View.VISIBLE);
} else {
moreView.setVisibility(View.GONE);
}
}
private PagedLoader getPageLoader() {
return this;
}
public Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
}
public void setOnScrollListener(OnScrollListener mOnScrollListener) {
this.mOnScrollListener = mOnScrollListener;
}
public enum Mode {
CLICK_TO_LOAD, AUTO_LOAD
}
public interface OnLoadListener {
void onLoading(PagedLoader pagedLoader, boolean isAutoLoad);
}
public static class Builder {
private Context mContext;
private PagedLoader pagedLoader;
private Builder(ListView listView) {
this.mContext = listView.getContext();
pagedLoader = new PagedLoader();
// 实例化底部布局
pagedLoader.moreView = LayoutInflater.from(mContext).inflate(R.layout.paged_foot,
pagedLoader.listView, false);
pagedLoader.normalTextView = (TextView) pagedLoader.moreView.findViewById(R.id.bt_load);
pagedLoader.finallyTextView = (TextView) pagedLoader.moreView.findViewById(R.id.bt_finally);
pagedLoader.progressBar = (ProgressWheel)pagedLoader.moreView.findViewById(R.id.pg);
pagedLoader.listView = listView;
}
public Builder setMode(Mode mode) {
pagedLoader.setMode(mode);
return this;
}
public Builder setNormalText(CharSequence text) {
pagedLoader.setNormalText(text);
return this;
}
public Builder setNormalText(int res) {
pagedLoader.setNormalText(res);
return this;
}
public Builder setFinallyText(CharSequence text) {
pagedLoader.setFinallyText(text);
return this;
}
public Builder setFinallyText(int res) {
pagedLoader.setFinallyText(res);
return this;
}
public Builder setOnLoadListener(OnLoadListener mOnLoadListener) {
pagedLoader.setOnLoadListener(mOnLoadListener);
return this;
}
public Builder setOnScrollListener(OnScrollListener mOnScrollListener) {
pagedLoader.setOnScrollListener(mOnScrollListener);
return this;
}
public Builder setFinallyText(String text) {
pagedLoader.setFinallyText(text);
return this;
}
public PagedLoader builder() {
if (pagedLoader.listView.getAdapter() != null) {
throw new RuntimeException("must set footview before set adapter");
}
// 加上底部View,注意要放在setAdapter方法前
pagedLoader.listView.addFooterView(pagedLoader.moreView, null, false);
pagedLoader.listView.setFooterDividersEnabled(false);
pagedLoader.normalTextView.setOnClickListener(pagedLoader);
if (pagedLoader.mode == Mode.AUTO_LOAD) {
// 绑定监听器
pagedLoader.listView.setOnScrollListener(pagedLoader.getPageLoader());
}
pagedLoader.setEnable(false);
return pagedLoader;
}
}
}