package org.aisen.wen.ui.view.impl;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
import org.aisen.wen.R;
import org.aisen.wen.base.GlobalContext;
import org.aisen.wen.support.utils.SharedPreferencesUtils;
import org.aisen.wen.ui.adapter.IPagingAdapter;
import org.aisen.wen.ui.itemview.AFooterItemView;
import org.aisen.wen.ui.itemview.AHeaderItemViewCreator;
import org.aisen.wen.ui.itemview.BasicFooterView;
import org.aisen.wen.ui.itemview.IITemView;
import org.aisen.wen.ui.itemview.IItemViewCreator;
import org.aisen.wen.ui.model.listener.PagingModelListenerParam;
import org.aisen.wen.ui.presenter.IPagingPresenter;
import org.aisen.wen.ui.view.IPaingView;
import java.io.Serializable;
import java.util.ArrayList;
/**
* Created by wangdan on 16/10/12.
*/
public abstract class APagingView<Item extends Serializable,
Result extends Serializable,
Header extends Serializable,
V extends ViewGroup>
extends AContentView implements IPaingView<Item, Result, Header, V>,
AFooterItemView.OnFooterViewCallback,
IPaingView.IPagingViewCallback {
private static final String SAVED_DATAS = "org.aisen.android.ui.Datas";
private static final String SAVED_CONFIG = "org.aisen.android.ui.Config";
IItemViewCreator<Item> mFooterItemViewCreator;
AFooterItemView<Item> mFooterItemView;// FooterView,滑动到底部时,自动加载更多数据
AHeaderItemViewCreator<Header> mHeaderItemViewCreator;
private IPagingAdapter<Item> mAdapter;
RefreshConfig refreshConfig;// 刷新方面的配置
private IPagingViewCallback pagingViewCallback;
@Override
public void onBridgeCreate(Bundle savedInstanceState) {
super.onBridgeCreate(savedInstanceState);
if (savedInstanceState == null) {
refreshConfig = new RefreshConfig();
}
else {
refreshConfig = (RefreshConfig) savedInstanceState.getSerializable(SAVED_CONFIG);
}
ArrayList<Item> datas = savedInstanceState == null ? new ArrayList<Item>()
: (ArrayList<Item>) savedInstanceState.getSerializable(SAVED_DATAS);
mAdapter = newAdapter(datas);
}
@Override
public void onBridgeSaveInstanceState(Bundle outState) {
super.onBridgeSaveInstanceState(outState);
if (refreshConfig != null)
outState.putSerializable(SAVED_CONFIG, refreshConfig);
onSaveDatas(outState);
}
/**
* 数据量比较大的时候,子类可以不保存,会阻塞
*
* @param outState
*/
protected void onSaveDatas(Bundle outState) {
// 将数据保存起来
if (getAdapter() != null && getAdapter().getDatas().size() != 0)
outState.putSerializable(SAVED_DATAS, getAdapter().getDatas());
}
@Override
public void onBridgeActivityCreate(Activity activity, Bundle savedInstanceState) {
super.onBridgeActivityCreate(activity, savedInstanceState);
setupRefreshConfig(refreshConfig);
setupRefreshView(savedInstanceState);
setupRefreshViewWithConfig(refreshConfig);
bindAdapter(getAdapter());
}
/**
* 子类配置
*
* @param config
*/
protected void setupRefreshConfig(RefreshConfig config) {
config.emptyHint = getViewContext().getString(R.string.comm_content_empty);
}
/**
* 初始化RefreshView
*
*/
protected void setupRefreshView(Bundle savedInstanceSate) {
if (refreshConfig != null && refreshConfig.footerMoreEnable) {
mFooterItemViewCreator = configFooterViewCreator();
View convertView = mFooterItemViewCreator.newContentView(getViewContext().getLayoutInflater(), null, IPagingAdapter.TYPE_FOOTER);
mFooterItemView = (AFooterItemView<Item>) mFooterItemViewCreator.newItemView(convertView, IPagingAdapter.TYPE_FOOTER);
}
mHeaderItemViewCreator = configHeaderViewCreator();
if (mFooterItemView != null) {
addFooterViewToRefreshView(mFooterItemView);
}
if (mHeaderItemViewCreator != null) {
addHeaderViewToRefreshView(mHeaderItemViewCreator);
}
}
@Override
public boolean setRefreshViewToLoading() {
return false;
}
/**
* 根据Config刷新RefreshView
*/
@Override
public void setupRefreshViewWithConfig(RefreshConfig config) {
}
/**
* 设置列表控件状态为刷新结束
*/
public void onRefreshViewFinished(IPagingPresenter.RefreshMode mode) {
}
@Override
public IPagingAdapter getAdapter() {
return mAdapter;
}
@Override
public void onPullDownToRefresh() {
if (pagingViewCallback != null) {
pagingViewCallback.onPullDownToRefresh();
}
}
@Override
public void onPullUpToRefresh() {
if (pagingViewCallback != null) {
pagingViewCallback.onPullUpToRefresh();
}
}
@Override
public boolean isContentEmpty() {
return getAdapter() == null || getAdapter().getDatas().size() == 0;
}
@Override
public AHeaderItemViewCreator<Header> configHeaderViewCreator() {
return null;
}
@Override
public ArrayList<Item> getAdapterItems() {
return getAdapter().getDatas();
}
@Override
public void setPagingViewCallback(IPagingViewCallback pagingViewCallback) {
this.pagingViewCallback = pagingViewCallback;
}
protected IItemViewCreator<Item> configFooterViewCreator() {
return new IItemViewCreator<Item>() {
@Override
public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) {
return inflater.inflate(BasicFooterView.LAYOUT_RES, parent, false);
}
@Override
public IITemView<Item> newItemView(View convertView, int viewType) {
return new BasicFooterView<>(getViewContext(), convertView, APagingView.this);
}
};
}
abstract protected void addFooterViewToRefreshView(AFooterItemView<?> footerItemView);
abstract protected void addHeaderViewToRefreshView(AHeaderItemViewCreator<?> headerItemViewCreator);
/*********************************************开始阅读位置历史************************************************/
@Override
public void toLastReadPosition() {
if (getRefreshView() == null || TextUtils.isEmpty(refreshConfig.positionKey))
return;
if (getRefreshView() instanceof ListView) {
ListView listView = (ListView) getRefreshView();
listView.setSelectionFromTop(getLastReadPosition(), getLastReadTop() + listView.getPaddingTop());
}
}
@Override
public int getLastReadPosition() {
return SharedPreferencesUtils.getIntShareData(GlobalContext.getInstance(), refreshConfig.positionKey + "Position", 0);
}
@Override
public void putLastReadPosition(int position) {
if (!TextUtils.isEmpty(refreshConfig.positionKey))
SharedPreferencesUtils.putIntShareData(GlobalContext.getInstance(), refreshConfig.positionKey + "Position", position);
}
@Override
public int getLastReadTop() {
return SharedPreferencesUtils.getIntShareData(GlobalContext.getInstance(), refreshConfig.positionKey + "Top", 0);
}
@Override
public void putLastReadTop(int top) {
if (!TextUtils.isEmpty(refreshConfig.positionKey))
SharedPreferencesUtils.putIntShareData(GlobalContext.getInstance(), refreshConfig.positionKey + "Top", top);
}
public int getFirstVisiblePosition() {
return 0;
}
/*********************************************结束阅读位置历史************************************************/
/**
* 设置列表控件状态为刷新结束
*/
@Override
public void setRefreshViewFinished(IPagingPresenter.RefreshMode mode) {
}
@Override
public void onTaskStateChanged(PagingModelListenerParam<Result> param) {
// 刷新FooterView
if (refreshConfig == null || !refreshConfig.footerMoreEnable || mFooterItemView == null)
return;
if (mFooterItemView != null) {
mFooterItemView.onTaskStateChanged(param);
}
}
void onScrollStateChanged(int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && // 停止滚动
!refreshConfig.pagingEnd && // 分页未加载完
refreshConfig.footerMoreEnable && // 自动加载更多
mFooterItemView != null // 配置了FooterView
) {
int childCount = getRefreshView().getChildCount();
if (childCount > 0 && getRefreshView().getChildAt(childCount - 1) == mFooterItemView.getConvertView()) {
if (mFooterItemView != null) {
mFooterItemView.setFooterViewToRefreshing();
}
}
}
// 保存最后浏览位置
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
if (!TextUtils.isEmpty(refreshConfig.positionKey) && getRefreshView() != null) {
putLastReadPosition(getFirstVisiblePosition());
putLastReadTop(getRefreshView().getChildAt(0).getTop());
}
}
}
void onScroll(int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
/**
* FooterView加载更多数据使能
*
* @return
*/
@Override
public boolean footerViewLoadMoreAbility() {
return refreshConfig == null || !refreshConfig.pagingEnd;
}
/**
* FooterView开始加载更多
*
*/
@Override
public void onFooterViewLoadMore() {
if (footerViewLoadMoreAbility()) {
onPullUpToRefresh();
}
}
@Override
public RefreshConfig getRefreshConfig() {
return refreshConfig;
}
}