package com.m.ui.fragment;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.android.loader.BitmapLoader;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ImageView;
import com.m.R;
import com.m.support.Inject.ViewInject;
import com.m.support.adapter.ABaseAdapter;
import com.m.support.adapter.ABaseAdapter.AbstractItemView;
public abstract class AViewPagerFragment<T extends Serializable, Ts extends Serializable> extends ARefreshFragment<T, Ts, View> {
@ViewInject(idStr = "viewPager")
private ViewPager viewPager;
private ABasePagerAdapter pagerAdapter;
@ViewInject(idStr = "dotLayout")
private ViewGroup dotLayout;
@Override
protected int inflateContentView() {
return R.layout.layout_viewpager;
}
@Override
void _layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
super._layoutInit(inflater, savedInstanceSate);
List<T> datas = savedInstanceSate != null ? (List<T>) savedInstanceSate.getSerializable("datas") : new ArrayList<T>();
int index = savedInstanceSate != null ? savedInstanceSate.getInt("", -1) : -1;
pagerAdapter = new ABasePagerAdapter(getActivity(), datas);
// viewPager.setTransitionEffect(TransitionEffect.FlipHorizontal);
// viewPager.setPageMargin(0);
viewPager.setAdapter(pagerAdapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
setSeletecdDotImage(arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
if (index != -1)
viewPager.setCurrentItem(index);
}
@Override
public AbsListView getRefreshView() {
return null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (pagerAdapter != null) {
outState.putSerializable("datas", (Serializable) pagerAdapter.getDatas());
outState.putInt("currentIndex", getViewPager().getCurrentItem());
}
}
@Override
void _refreshUI() {
getViewPagerAdapter().notifyDataSetChanged();
}
/**
*
* @return ViewPage使用的Adapter
*/
public ABasePagerAdapter getViewPagerAdapter() {
return pagerAdapter;
}
public ViewPager getViewPager() {
return viewPager;
}
@Override
public boolean isContentEmpty() {
return getViewPagerAdapter() != null && getViewPagerAdapter().getCount() > 0;
}
/**
* 请使用{@link #getViewPagerAdapter}
*/
@Override
@Deprecated
public ABaseAdapter<T> getAdapter() {
return null;
}
private void generateDotView() {
if (dotLayout == null || getViewPagerAdapter().getDatas() == null)
return;
if (getViewPagerAdapter().getCount() <= 1) {
dotLayout.setVisibility(View.GONE);
return;
} else {
dotLayout.setVisibility(View.VISIBLE);
}
int dotCount = getViewPagerAdapter().getDatas().size();
dotLayout.removeAllViews();
for (int i = 0; i < dotCount; i++) {
if (getActivity() == null)
break;
View dotView = setDotView();
dotLayout.addView(dotView, new ViewGroup.LayoutParams(15, 15));
dotView.setBackgroundResource(setDotDrawable());
}
setSeletecdDotImage(0);
}
protected void setSeletecdDotImage(int index) {
if (getViewPagerAdapter().getDatas().size() <= 1)
return;
if (getViewPagerAdapter().getDatas().size() > 0)
index = index % getViewPagerAdapter().getDatas().size();
if (dotLayout == null || dotLayout.getChildCount() == 0 || index >= getViewPagerAdapter().getDatas().size())
return;
for (int i = 0; i < dotLayout.getChildCount(); i++)
dotLayout.getChildAt(i).setSelected(index == i);
}
protected int setDotDrawable() {
return R.drawable.selector_dot;
}
protected View setDotView() {
return new ImageView(getActivity());
}
protected abstract class ViewPagerTask<Params, Progress, Result extends Serializable> extends PagingTask<Params, Progress, Result> {
public ViewPagerTask(String taskId, RefreshMode mode) {
super(taskId, mode);
}
@SuppressWarnings("unchecked")
@Override
protected void onSuccess(Result result) {
List<T> resultList;
if (result instanceof List)
resultList = (List<T>) result;
else
resultList = parseResult(result);
if (getViewPagerAdapter() != null) {
// 如果子类没有处理新获取的数据刷新UI,默认替换所有数据
if (!handleResult(mode, resultList))
if (mode == RefreshMode.reset)
getViewPagerAdapter().setDataAndRefresh(new ArrayList<T>());
if (resultList.size() != 0) {
generateDotView();
}
if (mode == RefreshMode.reset || mode == RefreshMode.refresh)
getViewPagerAdapter().addItemsAtFrontAndRefresh(resultList);
else if (mode == RefreshMode.update)
getViewPagerAdapter().addItemsAndRefresh(resultList);
if (mPagingProxy != null) {
if (getViewPagerAdapter() != null && getViewPagerAdapter().getDatas().size() != 0)
mPagingProxy.processData(result, getViewPagerAdapter().getDatas().get(0),
getViewPagerAdapter().getDatas().get(getViewPagerAdapter().getCount() - 1));
else
mPagingProxy.processData(result, null, null);
}
}
super.onSuccess(result);
}
@Override
protected boolean handleResult(RefreshMode mode, List<T> datas) {
if (true) return false;
boolean isRepeat = pagerAdapter.isRepeat;
pagerAdapter = new ABasePagerAdapter(getActivity(), datas);
pagerAdapter.setRepeat(isRepeat);
viewPager.setAdapter(pagerAdapter);
if (pagerAdapter.isRepeat())
viewPager.setCurrentItem(datas.size() * 1000);
return true;
}
}
public class ABasePagerAdapter extends PagerAdapter {
private Context mContext;
private Queue<View> unUsedViewStorer;
private List<T> datas;
private boolean isRepeat;
public ABasePagerAdapter(Context context, List<T> datas) {
if (datas == null)
datas = new ArrayList<T>();
this.mContext = context;
this.datas = datas;
unUsedViewStorer = new LinkedList<View>();
}
public void setRepeat(boolean isRepeat) {
this.isRepeat = isRepeat;
}
public boolean isRepeat() {
return isRepeat;
}
public void addItemsAtFront(List<T> entries) {
for (int i = entries.size() - 1; i >= 0; i--) {
datas.add(0, entries.get(i));
}
}
public void addItemsAtFrontAndRefresh(List<T> entries) {
addItemsAtFront(entries);
notifyDataSetChanged();
}
public void addItems(List<T> entries) {
for (T entry : entries)
datas.add(entry);
}
public void addItemsAndRefresh(List<T> entries) {
addItems(entries);
notifyDataSetChanged();
}
public void setDataAndRefresh(List<T> datas) {
this.datas = datas;
notifyDataSetChanged();
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
public List<T> getDatas() {
return datas;
}
@Override
public int getCount() {
if (datas.size() < 3)
return datas.size();
return isRepeat ? Integer.MAX_VALUE : datas.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (isRepeat && datas.size() != 0)
position = position % datas.size();
AbstractItemView<T> viewProcessor = null;
View childView = unUsedViewStorer.poll();
if (childView == null) {
viewProcessor = newItemView();
childView = View.inflate(mContext, viewProcessor.inflateViewId(), null);
childView.setTag(viewProcessor);
viewProcessor.bindingView(childView);
} else {
viewProcessor = (AbstractItemView) childView.getTag();
}
childView.setId(position);
viewProcessor.setPosition(position);
viewProcessor.bindingData(childView, datas.get(position));
// XXX 暂时不支持选中项
viewProcessor.updateConvertView(datas.get(position), childView, -1);
container.addView(childView);
// viewPager.setObjectForPosition(childView, position);
return childView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (isRepeat)
position = position % datas.size();
View childView = container.findViewById(position);
int[] ids = recyleImageViewRes();
if (ids != null) {
for (int id : ids) {
ImageView imgView = (ImageView) childView.findViewById(id);
if (imgView != null)
imgView.setImageDrawable(BitmapLoader.getLoadingDrawable(imgView));
}
}
unUsedViewStorer.add(childView);
AbstractItemView viewProcessor = (AbstractItemView) childView.getTag();
viewProcessor.recycleView(childView);
container.removeView(childView);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
}