package org.aisen.weibo.sina.ui.fragment.comment; 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.task.TaskException; import org.aisen.android.support.paging.IPaging; import org.aisen.android.ui.fragment.ARecycleViewSwipeRefreshFragment; import org.aisen.android.ui.fragment.ATabsFragment; import org.aisen.android.ui.fragment.adapter.BasicRecycleViewAdapter; 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.AppContext; import org.aisen.weibo.sina.base.AppSettings; import org.aisen.weibo.sina.sinasdk.SinaSDK; import org.aisen.weibo.sina.sinasdk.bean.StatusComment; import org.aisen.weibo.sina.sinasdk.bean.StatusComments; import org.aisen.weibo.sina.support.paging.CommentPaging; import org.aisen.weibo.sina.support.utils.AisenUtils; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import org.aisen.weibo.sina.ui.fragment.mention.MentionCmtItemView; import java.util.ArrayList; import java.util.List; /** * 评论列表,我发出的和我收到的 * * Created by wangdan on 16/1/24. */ public class CommentsFragment extends ARecycleViewSwipeRefreshFragment<StatusComment, StatusComments> implements AdapterView.OnItemLongClickListener, ATabsFragment.ITabInitData { public static CommentsFragment newInstance(Type type) { CommentsFragment fragment = new CommentsFragment(); Bundle args = new Bundle(); args.putSerializable("type", type.toString()); fragment.setArguments(args); return fragment; } public enum Type { toMe, byMe } private BizFragment bizFragment; private Type type; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); type = savedInstanceState == null ? Type.valueOf(getArguments().getString("type")) : Type.valueOf(savedInstanceState.getString("type")); bizFragment = BizFragment.createBizFragment(this); } private void setViewPadding(View viewGroup) { viewGroup.setPadding(viewGroup.getPaddingLeft(), viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), SystemUtils.getNavigationBarHeight(getActivity())); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("type", type.toString()); } @Override protected void setupRefreshConfig(RefreshConfig config) { super.setupRefreshConfig(config); config.emptyHint = getString(R.string.empty_cmts); } @Override protected IItemViewCreator<StatusComment> configFooterViewCreator() { return new IItemViewCreator<StatusComment>() { @Override public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) { return inflater.inflate(BasicFooterView.LAYOUT_RES, parent, false); } @Override public IITemView<StatusComment> newItemView(View convertView, int viewType) { return new BasicFooterView<StatusComment>(getActivity(), convertView, CommentsFragment.this) { @Override protected String endpagingText() { return getString(R.string.disable_comments); } @Override protected String loadingText() { return String.format(getString(R.string.loading_cmts), AppSettings.getCommentCount()); } }; } }; } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); if (getAdapter() instanceof BasicRecycleViewAdapter) { ((BasicRecycleViewAdapter) getAdapter()).setOnItemLongClickListener(this); } setViewPadding(getEmptyLayout()); setViewPadding(getLoadFailureLayout()); setViewPadding(getLoadingLayout()); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { super.onItemClick(parent, view, position, id); bizFragment.replyComment(null, getAdapterItems().get(position)); } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { view.findViewById(R.id.btnMenus).performClick(); return true; } @Override protected IPaging<StatusComment, StatusComments> newPaging() { return new CommentPaging(); } @Override public IItemViewCreator<StatusComment> configItemViewCreator() { return new IItemViewCreator<StatusComment>() { @Override public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) { return inflater.inflate(MentionCmtItemView.RES_LAYOUT_ID, parent, false); } @Override public IITemView<StatusComment> newItemView(View convertView, int viewType) { return new MentionCmtItemView(convertView, CommentsFragment.this, bizFragment); } }; } @Override public void requestData(RefreshMode mode) { boolean load = true; // 如果还没有加载过数据,切且显示的是当前的页面 if (getTaskCount(PAGING_TASK_ID) == 0) { load = AisenUtils.checkTabsFragmentCanRequestData(this); } if (load) { if (type == Type.toMe) new CommentToMe(mode).execute(); else if (type == Type.byMe) new CommentByMe(mode).execute(); } } @Override public void onTabRequestData() { // 如果还没有加载过数据,就开始加载 if (getTaskCount(PAGING_TASK_ID) == 0) { requestData(RefreshMode.reset); } } // 发给我的评论 class CommentToMe extends CommentsTask { public CommentToMe(RefreshMode mode) { super(mode); } @Override protected StatusComments workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... params) throws TaskException { String sinceId = null; String maxId = null; String filterByAuthor = null; if (mode == RefreshMode.refresh && !TextUtils.isEmpty(previousPage)) sinceId = previousPage; if (mode == RefreshMode.update && !TextUtils.isEmpty(nextPage)) maxId = nextPage; filterByAuthor = "0"; return SinaSDK.getInstance(AppContext.getAccount().getAccessToken(), getTaskCacheMode(this)) .commentsToMe(sinceId, maxId, filterByAuthor, String.valueOf(AppSettings.getCommentCount())); } @Override protected void onSuccess(StatusComments result) { super.onSuccess(result); if (AppContext.getAccount().getUnreadCount() != null && AppContext.getAccount().getUnreadCount().getCmt() > 0) { if (getActivity() == null) return; if (result.fromCache()) requestDataDelaySetRefreshing(AppSettings.REQUEST_DATA_DELAY); bizFragment.remindSetCount(BizFragment.RemindType.cmt); } } }; // 我发出的评论 class CommentByMe extends CommentsTask { public CommentByMe(RefreshMode mode) { super(mode); } @Override protected StatusComments workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... params) throws TaskException { String sinceId = null; String maxId = null; if (mode == RefreshMode.refresh && !TextUtils.isEmpty(previousPage)) sinceId = previousPage; if (mode == RefreshMode.update && !TextUtils.isEmpty(nextPage)) maxId = nextPage; return SinaSDK.getInstance(AppContext.getAccount().getAccessToken(), getTaskCacheMode(this)) .commentsByMe(sinceId, maxId, String.valueOf(AppSettings.getCommentCount())); } }; abstract class CommentsTask extends APagingTask<Void, Void, StatusComments> { public CommentsTask(RefreshMode mode) { super(mode); } @Override protected List<StatusComment> parseResult(StatusComments result) { return result.getComments(); } @Override protected boolean handleResult(RefreshMode mode, List datas) { // 如果是重置或者刷新数据,加载数据大于分页大小,则清空之前的数据 if (mode == RefreshMode.refresh) // 目前微博加载分页大小是默认大小 if (datas.size() >= AppSettings.getCommentCount()) { setAdapterItems(new ArrayList<StatusComment>()); return true; } return super.handleResult(mode, datas); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); if (isContentEmpty()) showMessage(exception.getMessage()); } } @Override public boolean onToolbarDoubleClick() { if (AisenUtils.checkTabsFragmentCanRequestData(this)) { requestDataDelaySetRefreshing(AppSettings.REQUEST_DATA_DELAY); getRefreshView().scrollToPosition(0); return true; } return false; } }