package org.aisen.weibo.sina.ui.fragment.timeline;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import org.aisen.android.common.utils.SystemUtils;
import org.aisen.android.network.http.Params;
import org.aisen.android.network.task.TaskException;
import org.aisen.android.support.paging.IPaging;
import org.aisen.android.ui.fragment.APagingFragment;
import org.aisen.android.ui.fragment.ARecycleViewSwipeRefreshFragment;
import org.aisen.android.ui.fragment.adapter.BasicRecycleViewAdapter;
import org.aisen.android.ui.fragment.adapter.IPagingAdapter;
import org.aisen.android.ui.fragment.itemview.AHeaderItemViewCreator;
import org.aisen.android.ui.fragment.itemview.BasicFooterView;
import org.aisen.android.ui.fragment.itemview.IITemView;
import org.aisen.android.ui.fragment.itemview.IItemViewCreator;
import org.aisen.weibo.sina.R;
import org.aisen.weibo.sina.base.AppSettings;
import org.aisen.weibo.sina.sinasdk.bean.StatusContent;
import org.aisen.weibo.sina.sinasdk.bean.StatusContents;
import org.aisen.weibo.sina.support.paging.TimelinePaging;
import org.aisen.weibo.sina.ui.activity.base.MainActivity;
import org.aisen.weibo.sina.ui.fragment.base.BizFragment;
import org.aisen.weibo.sina.ui.fragment.comment.TimelineDetailPagerFragment;
import org.aisen.weibo.sina.ui.fragment.mention.MentionTimelineFragment;
import java.util.ArrayList;
import java.util.List;
/**
* 微博列表基类
*
* Created by wangdan on 16/1/2.
*/
public abstract class ATimelineFragment extends ARecycleViewSwipeRefreshFragment<StatusContent, StatusContents> {
private String feature = "0";
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getActivity() instanceof MainActivity) {
BizFragment.createBizFragment(getActivity()).getFabAnimator().attachToRecyclerView(getRefreshView(), null, null);
}
if (getArguments() == null) {
feature = savedInstanceState == null ? feature
: savedInstanceState.getString("feature", "0");
}
else {
feature = savedInstanceState == null ? getArguments().getString("feature", "0")
: savedInstanceState.getString("feature", "0");
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("feature", feature);
}
@Override
protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
super.layoutInit(inflater, savedInstanceSate);
if (this instanceof TimelineDefFragment || this instanceof TimelineGroupsFragment ||
this instanceof MentionTimelineFragment) {
setViewPadding(getEmptyLayout());
setViewPadding(getLoadFailureLayout());
setViewPadding(getLoadingLayout());
}
}
private void setViewPadding(View viewGroup) {
viewGroup.setPadding(viewGroup.getPaddingLeft(), viewGroup.getPaddingTop(),
viewGroup.getPaddingRight(), SystemUtils.getNavigationBarHeight(getActivity()));
}
@Override
protected AHeaderItemViewCreator<StatusContent> configHeaderViewCreator() {
if (this instanceof TimelineDefFragment || this instanceof TimelineGroupsFragment) {
return new AHeaderItemViewCreator<StatusContent>() {
@Override
public int[][] setHeaders() {
return new int[][]{ { ATimelineHeaderView.LAYOUT_RES, 100 } };
}
@Override
public IITemView<StatusContent> newItemView(View convertView, int viewType) {
return new ATimelineHeaderView(ATimelineFragment.this, convertView) {
@Override
protected int getTitleArrRes() {
return R.array.timeline_headers;
}
@Override
protected String[] getTitleFeature() {
return ATimelineHeaderView.timelineFeatureArr;
}
};
}
};
}
return super.configHeaderViewCreator();
}
@Override
public IItemViewCreator<StatusContent> configItemViewCreator() {
return new IItemViewCreator<StatusContent>() {
@Override
public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) {
if (5 == viewType) {
return inflater.inflate(TimelinePhotosItemView.LAYOUT_RES, parent, false);
}
return inflater.inflate(TimelineItemView.LAYOUT_RES, parent, false);
}
@Override
public IITemView<StatusContent> newItemView(View convertView, int viewType) {
if (5 == viewType) {
return new TimelinePhotosItemView(convertView, ATimelineFragment.this);
}
return new TimelineItemView(convertView, ATimelineFragment.this);
}
};
}
@Override
protected IPagingAdapter<StatusContent> newAdapter(ArrayList<StatusContent> datas) {
return new TimelineAdapter(this, configItemViewCreator(), datas);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
super.onItemClick(parent, view, position, id);
TimelineDetailPagerFragment.launch(getActivity(), getAdapterItems().get(position));
}
@Override
protected IPaging<StatusContent, StatusContents> newPaging() {
return new TimelinePaging();
}
@Override
protected IItemViewCreator<StatusContent> configFooterViewCreator() {
return new IItemViewCreator<StatusContent>() {
@Override
public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) {
return inflater.inflate(BasicFooterView.LAYOUT_RES, parent, false);
}
@Override
public IITemView<StatusContent> newItemView(View convertView, int viewType) {
return new BasicFooterView<StatusContent>(getActivity(), convertView, ATimelineFragment.this) {
@Override
protected String endpagingText() {
return getString(R.string.disable_status);
}
@Override
protected String loadingText() {
return String.format(getString(R.string.loading_status), AppSettings.getCommentCount());
}
};
}
};
}
class TimelineAdapter extends BasicRecycleViewAdapter<StatusContent> {
public TimelineAdapter(APagingFragment holderFragment, IItemViewCreator<StatusContent> itemViewCreator, ArrayList<StatusContent> datas) {
super(holderFragment, itemViewCreator, datas);
}
@Override
public int getItemViewType(int position) {
int itemType = super.getItemViewType(position);
// 如果不是HeaderView和FooterView
if (itemType == IPagingAdapter.TYPE_NORMAL) {
return Integer.parseInt(getFeature());
}
return itemType;
}
}
abstract public class ATimelineTask extends APagingTask<Void, Void, StatusContents> {
public ATimelineTask(RefreshMode mode) {
super(mode);
}
@Override
protected List<StatusContent> parseResult(StatusContents statusContents) {
return statusContents.getStatuses();
}
@Override
protected StatusContents workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... p) throws TaskException {
Params params = new Params();
// 是否是原创
if (!TextUtils.isEmpty(getFeature())) {
if ("5".equals(getFeature())) {
params.addParameter("feature", "2");
}
else {
params.addParameter("feature", getFeature());
}
}
if (mode == APagingFragment.RefreshMode.refresh && !TextUtils.isEmpty(previousPage))
params.addParameter("since_id", previousPage);
if (mode == APagingFragment.RefreshMode.update && !TextUtils.isEmpty(nextPage))
params.addParameter("max_id", nextPage);
params.addParameter("count", String.valueOf(AppSettings.getTimelineCount()));
return getStatusContents(params);
}
@Override
protected boolean handleResult(RefreshMode mode, List<StatusContent> datas) {
// 如果是重置或者刷新数据,加载数据大于分页大小,则清空之前的数据
if (mode == RefreshMode.refresh) {
// 目前微博加载分页大小是默认大小
if (datas.size() >= AppSettings.getTimelineCount()) {
setAdapterItems(new ArrayList<StatusContent>());
return true;
}
}
return super.handleResult(mode, datas);
}
@Override
protected void onFailure(TaskException exception) {
super.onFailure(exception);
if (!isContentEmpty())
showMessage(exception.getMessage());
}
public abstract StatusContents getStatusContents(Params params) throws TaskException;
}
@Override
public void onResume() {
super.onResume();
// 刷新点赞数据
if (getRefreshView() != null && getRefreshView().getChildCount() > 0) {
for (int i = 0; i < getRefreshView().getChildCount(); i++) {
View view = getRefreshView().getChildAt(i);
if (view.getTag(R.id.itemview) != null && view.getTag(R.id.itemview) instanceof TimelineItemView) {
((TimelineItemView) view.getTag(R.id.itemview)).setLikeView();
}
}
}
}
public String getFeature() {
return feature;
}
public void setFeature(String feature) {
this.feature = feature;
}
}