/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rincliu.library.widget.listpager;
import java.util.ArrayList;
import com.rincliu.library.R;
import com.rincliu.library.widget.pulltorefresh.PullToRefreshBase;
import com.rincliu.library.widget.pulltorefresh.PullToRefreshListView;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
public class ListPagerView extends PullToRefreshListView {
private DataObserver dataObserver;
private View custom_header_view;
private View custom_footer_view;
private View custom_empty_view;
private ListView list_view;
private Drawable dividerDrawable = null;
private boolean isShowStartTime = true;
private boolean isShowEndTime = true;
private boolean isShowFastScrollBar = false;
private int dividerHeight = 0;
Context context;
ItemHandler itemHandler;
boolean isReverse = false;
/**
* @param context
*/
protected ListPagerView(Context context) {
super(context);
this.context = context;
}
/**
* @param context
* @param attrs
*/
protected ListPagerView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ListPagerView);
if (typedArray.hasValue(R.styleable.ListPagerView_isReverse)) {
this.isReverse = typedArray.getBoolean(R.styleable.ListPagerView_isReverse, false);
}
if (typedArray.hasValue(R.styleable.ListPagerView_isShowStartTime)) {
this.isShowStartTime = typedArray.getBoolean(R.styleable.ListPagerView_isShowStartTime, true);
}
if (typedArray.hasValue(R.styleable.ListPagerView_isShowEndTime)) {
this.isShowEndTime = typedArray.getBoolean(R.styleable.ListPagerView_isShowEndTime, true);
}
if (typedArray.hasValue(R.styleable.ListPagerView_isShowFastScrollBar)) {
this.isShowFastScrollBar = typedArray.getBoolean(R.styleable.ListPagerView_isShowFastScrollBar, true);
}
if (typedArray.hasValue(R.styleable.ListPagerView_dividerHeight)) {
this.dividerHeight = typedArray.getInteger(R.styleable.ListPagerView_dividerHeight, 0);
}
if (typedArray.hasValue(R.styleable.ListPagerView_dividerDrawable)) {
this.dividerDrawable = typedArray.getDrawable(R.styleable.ListPagerView_dividerDrawable);
}
typedArray.recycle();
}
/**
* @param is
*/
public void setIsReverse(boolean is) {
isReverse = is;
}
/**
* @param customHeaderView
* @param customFooterView
* @param customEmptyView
*/
public void setCustomViews(View customHeaderView, View customFooterView, View customEmptyView) {
this.custom_header_view = customHeaderView;
this.custom_footer_view = customFooterView;
this.custom_empty_view = customEmptyView;
}
/**
* @param position
*/
public void setSelection(int position) {
list_view.setSelection(position);
}
/**
* @param itemHandler
*/
public void handleItem(ItemHandler itemHandler) {
this.itemHandler = itemHandler;
}
/**
* @param dataObserver
*/
public void setDataAdapter(DataObserver dataObserver) {
this.dataObserver = dataObserver;
}
/**
* @param isShowStartTime
*/
public void setIsShowStartTime(boolean isShowStartTime) {
this.isShowStartTime = isShowStartTime;
}
/**
* @return
*/
public boolean getIsShowStartTime() {
return isShowStartTime;
}
/**
* @param isShowEndTime
*/
public void setIsShowEndTime(boolean isShowEndTime) {
this.isShowEndTime = isShowEndTime;
}
/**
* @return
*/
public boolean getIsShowEndTime() {
return isShowEndTime;
}
/**
* @param isShowFastScrollBar
*/
public void setIsShowFastScrollBar(boolean isShowFastScrollBar) {
this.isShowFastScrollBar = isShowFastScrollBar;
}
/**
* @param dividerHeight
*/
public void setDividerHeight(int dividerHeight) {
this.dividerHeight = dividerHeight;
}
/**
* @param dividerDrawable
*/
public void setDividerDrawable(Drawable dividerDrawable) {
this.dividerDrawable = dividerDrawable;
}
/**
* Get the data set.
*
* @return
*/
public ArrayList<Object> getDataSet() {
if (dataObserver == null) {
return null;
}
return dataObserver.getDataSet();
}
/**
* Modify the data set without notifying the adapter.
*
* @param list
*/
public void setDataSet(ArrayList<Object> list) {
if (dataObserver == null) {
return;
}
dataObserver.setDataSet(list);
}
/**
*
*/
public void notifyAdapter() {
if (dataObserver == null) {
return;
}
dataObserver.notifyAdapter();
}
private boolean hasInit = false;
/**
*
*/
public void show() {
if (!hasInit) {
list_view = super.getRefreshableView();
if (dividerDrawable != null) {
list_view.setDivider(dividerDrawable);
}
list_view.setDividerHeight(dividerHeight);
if (isShowFastScrollBar) {
list_view.setFastScrollEnabled(true);
}
list_view.setOnItemClickListener(onItemClickListener);
list_view.setOnItemLongClickListener(onItemLongClickListener);
if (custom_header_view != null) {
list_view.addHeaderView(custom_header_view);
custom_header_view.setVisibility(View.GONE);
}
super.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
if (dataObserver != null) {
if (isReverse) {
onStartLoadMore();
dataObserver.loadMore();
} else {
onStartRefresh();
dataObserver.refresh();
}
}
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
if (dataObserver != null) {
if (isReverse) {
onStartRefresh();
dataObserver.refresh();
} else {
onStartLoadMore();
dataObserver.loadMore();
}
}
}
});
super.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
if (itemHandler != null) {
if (dataObserver != null) {
if (dataObserver.hasMore()) {
itemHandler.onPageLastItemVisible();
} else {
itemHandler.onGlobalLastItemVisible();
}
} else {
itemHandler.onPageLastItemVisible();
}
}
}
});
hasInit = true;
}
if (dataObserver != null) {
super.setAdapter(dataObserver.getBaseAdapter());
onStartRefresh();
super.setShowViewWhileRefreshing(true);
super.setRefreshing(true);
dataObserver.refresh();
}
}
/**
*
*/
public void clear() {
if (dataObserver != null && getDataSet() != null) {
getDataSet().clear();
dataObserver.getBaseAdapter().notifyDataSetChanged();
}
}
/**
*
*/
public void onStartRefresh() {
// TODO
}
/**
*
*/
public void onStopRefresh() {
if (isReverse && getDataSet() != null && getDataSet().size() > 0) {
getRefreshableView().setSelection(getDataSet().size() - 1);
}
// TODO
}
/**
*
*/
public void onStartLoadMore() {
// TODO
}
/**
*
*/
public void onStopLoadMore() {
// TODO
}
void notifyFinish(boolean isRefresh) {
super.onRefreshComplete();
if (isRefresh) {
onStopRefresh();
} else {
onStopLoadMore();
}
if (custom_header_view != null) {
custom_header_view.setVisibility(View.VISIBLE);
}
if (custom_empty_view != null) {
setEmptyView(custom_empty_view);
} else {
setEmptyView(LayoutInflater.from(context).inflate(R.layout.listpager_empty, null));
}
}
void addFooter() {
if (custom_footer_view != null) {
list_view.addFooterView(custom_footer_view);
}
}
void removeFooter() {
if (custom_footer_view != null) {
list_view.removeFooterView(custom_footer_view);
}
}
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (dataObserver == null || itemHandler == null) {
return;
}
int headers = list_view.getHeaderViewsCount();
if (position >= headers && position < dataObserver.getDataSet().size() + headers) {
itemHandler.onItemClick(parent, view, position - headers, id);
}
}
};
private OnItemLongClickListener onItemLongClickListener = new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (dataObserver == null || itemHandler == null) {
return false;
}
int headers = list_view.getHeaderViewsCount();
if (position >= headers && position < dataObserver.getDataSet().size() + headers) {
return itemHandler.onItemLongClick(parent, view, position - headers, id);
} else {
return false;
}
}
};
/**
*
*/
public interface ItemHandler {
public View onGetItemView(int position, View convertView, ViewGroup parent);
public void onItemClick(AdapterView<?> parent, View view, int position, long id);
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id);
public void onPageLastItemVisible();
public void onGlobalLastItemVisible();
}
/**
*
*/
public interface DataObserver {
public void notifyAdapter();
public BaseAdapter getBaseAdapter();
public ArrayList<Object> getDataSet();
public void setDataSet(ArrayList<Object> list);
public void refresh();
public void loadMore();
public boolean hasMore();
}
}