package org.aisen.weibo.sina.ui.fragment.timeline; import java.util.ArrayList; import java.util.List; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.support.bean.TimelineGroupBean; import org.aisen.weibo.sina.support.paging.TimelinePagingProcessor; import org.aisen.weibo.sina.support.utils.AisenUtil; import org.aisen.weibo.sina.support.utils.AppContext; import org.aisen.weibo.sina.support.utils.AppSettings; import org.aisen.weibo.sina.ui.activity.guide.MainGuideActivity; import org.aisen.weibo.sina.ui.activity.main.MainActivity; import org.aisen.weibo.sina.ui.component.TimelineItemView; import org.aisen.weibo.sina.ui.fragment.base.ARefreshProxyFragment; import org.aisen.weibo.sina.ui.fragment.comment.TimelineCommentsFragment; import org.aisen.weibo.sina.ui.widget.TimelinePicsView; import org.sina.android.bean.StatusContent; import org.sina.android.bean.StatusContents; import org.sina.android.bean.WeiBoUser; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import com.m.common.utils.Logger; import com.m.support.adapter.ABaseAdapter.AbstractItemView; import com.m.support.paging.IPaging; import com.m.support.task.TaskException; import com.m.ui.activity.AViewpagerActivity; import com.m.ui.fragment.ABaseFragment; import com.m.ui.fragment.ATabTitlePagerFragment; /** * 微博列表基类 * * @author wangdan * */ public abstract class ATimelineFragment extends ARefreshProxyFragment<StatusContent, StatusContents> implements OnItemClickListener, OnItemLongClickListener { private TimelineGroupBean mGroupBean; private WeiBoUser loggedIn; @Override protected int inflateContentView() { return R.layout.ui_timeline_v2; } @Override public void onCreate(Bundle savedInstanceSate) { mGroupBean = savedInstanceSate == null ? (TimelineGroupBean) getArguments().getSerializable("bean") : (TimelineGroupBean) savedInstanceSate.getSerializable("bean"); super.onCreate(savedInstanceSate); } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); loggedIn = AppContext.getUser(); getRefreshView().setOnItemClickListener(this); getRefreshView().setOnItemLongClickListener(this); setHasOptionsMenu(true); } @Override protected void config(RefreshConfig config) { super.config(config); config.savePosition = true; config.emptyLabel = getString(R.string.empty_status); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("bean", mGroupBean); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) getRefreshView(); int index = listView.getHeaderViewsCount(); if (getAdapterCount() > 0 && position >= index) { StatusContent status = getAdapterItems().get(position - index); TimelineCommentsFragment.launch(this, status); } } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { view.findViewById(R.id.btnMenus).performClick(); return true; } @Override protected IPaging<StatusContent, StatusContents> configPaging() { return new TimelinePagingProcessor(); } @Override protected AbstractItemView<StatusContent> newItemView() { return new TimelineItemView(this, true); } public abstract class TimelineTask extends PagingTask<Void, Void, StatusContents> { public TimelineTask(RefreshMode mode) { super("TimelineTask", mode); } @Override protected List<StatusContent> parseResult(StatusContents result) { return result.getStatuses(); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); showMessage(exception.getMessage()); } @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 onSuccess(StatusContents result) { if (result == null) return; super.onSuccess(result); ListView listView = (ListView) getRefreshView(); // 2014-08-27 当刷新列表时,返回最上面 if (mode == RefreshMode.reset && getTaskCount(getTaskId()) > 1) listView.setSelectionFromTop(0, 0); // 2014-09-11 显示首页引导 if (getActivity() != null && getActivity() instanceof MainActivity) { MainActivity mainActivity = (MainActivity) getActivity(); if (!mainActivity.isDrawerOpened() && MainGuideActivity.canGuide()) { MainGuideActivity.launch(mainActivity); } } } } public TimelineGroupBean getGroup() { return mGroupBean; } static final int[] imageResArr = new int[] { R.id.img01, R.id.img02, R.id.img03, R.id.img04, R.id.img05, R.id.img06, R.id.img07, R.id.img08, R.id.img09, R.id.imgPhoto, R.id.imgRePhoto }; @Override protected int[] recyleImageViewRes() { return imageResArr; } /** * 如果当前的视图是Pager显示的视图,释放后会造成视图闪烁的情况出现 */ @Override public void onMovedToScrapHeap(View view) { CharSequence current = getTabShowingTitle(); if (!TextUtils.isEmpty(current) && mGroupBean.getTitle().equals(current.toString())) { Logger.v("当前展示的是" + current + ",不释放视图"); return; } super.onMovedToScrapHeap(view); } /** * 如果Pager显示的不是当前视图,则不刷新视图 */ @Override public void refreshUI() { CharSequence current = getTabShowingTitle(); if (!TextUtils.isEmpty(current) && !mGroupBean.getTitle().equals(current.toString())) { Logger.v("展示的是" + current + ", 当前是" + mGroupBean.getTitle() + ",不刷新视图"); return; } super.refreshUI(); } private String getTabShowingTitle() { ABaseFragment aFragment = (ABaseFragment) getActivity().getFragmentManager().findFragmentByTag("MainFragment"); if (aFragment instanceof ATabTitlePagerFragment) { @SuppressWarnings("rawtypes") ATabTitlePagerFragment fragment = (ATabTitlePagerFragment) aFragment; if (fragment != null && fragment.getViewPagerAdapter() != null && fragment.getViewPager() != null) { CharSequence current = fragment.getViewPagerAdapter().getPageTitle(fragment.getViewPager().getCurrentItem()); return current.toString(); } } return null; } @Override protected boolean releaseView(View view) { TimelinePicsView picsView = (TimelinePicsView) view.findViewById(R.id.layPicturs); if (picsView != null) picsView.release(); return super.releaseView(view); } @Override public String getLastReadKey() { if (getGroup() != null) return AisenUtil.getUserKey(getGroup().getType(), loggedIn); return null; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.removeGroup(R.id.timeline); if (getActivity() instanceof MainActivity) { inflater.inflate(R.menu.refresh_timeline, menu); } } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if (getActivity() instanceof MainActivity) { MainActivity mainActivity = (MainActivity) getActivity(); menu.findItem(R.id.refresh).setVisible(!mainActivity.isDrawerOpened()); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // 刷新微博列表 if (item.getItemId() == R.id.refresh) { if (!setRefreshing()) requestData(RefreshMode.reset); } return super.onOptionsItemSelected(item); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 微博被删除了 if (resultCode == Activity.RESULT_OK && requestCode == 1000) { String statusId = data.getStringExtra("status"); if (!TextUtils.isEmpty(statusId)) { for (int i = 0; i < getAdapterItems().size(); i++) { if (statusId.equals(getAdapterItems().get(i).getId())) { getAdapterItems().remove(i); getAdapter().notifyDataSetChanged(); break; } } } } } @Override public boolean onAcUnusedDoubleClicked() { ABaseFragment aFragment = (ABaseFragment) getActivity().getFragmentManager().findFragmentByTag("MainFragment"); if (aFragment instanceof ATabTitlePagerFragment) { @SuppressWarnings("rawtypes") ATabTitlePagerFragment tabTitlePagerFragment = (ATabTitlePagerFragment) aFragment; if (tabTitlePagerFragment.getCurrentFragment() == this) return super.onAcUnusedDoubleClicked(); else return false; } if (getActivity() instanceof AViewpagerActivity) { AViewpagerActivity activity = (AViewpagerActivity) getActivity(); if (activity.getCurrentFragment() == this) return super.onAcUnusedDoubleClicked(); else return false; } return super.onAcUnusedDoubleClicked(); } }