package com.yaoyumeng.v2ex.ui.fragment; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.melnykov.fab.FloatingActionButton; import com.twotoasters.jazzylistview.effects.FadeEffect; import com.twotoasters.jazzylistview.recyclerview.JazzyRecyclerViewScrollListener; import com.yaoyumeng.v2ex.Application; import com.yaoyumeng.v2ex.R; import com.yaoyumeng.v2ex.api.HttpRequestHandler; import com.yaoyumeng.v2ex.api.V2EXManager; import com.yaoyumeng.v2ex.database.V2EXDataSource; import com.yaoyumeng.v2ex.model.NodeModel; import com.yaoyumeng.v2ex.model.TopicModel; import com.yaoyumeng.v2ex.ui.BaseActivity; import com.yaoyumeng.v2ex.ui.TopicAddActivity; import com.yaoyumeng.v2ex.ui.adapter.HeaderViewRecyclerAdapter; import com.yaoyumeng.v2ex.ui.adapter.TopicsAdapter; import com.yaoyumeng.v2ex.ui.widget.DividerItemDecoration; import com.yaoyumeng.v2ex.ui.widget.FootUpdate; import com.yaoyumeng.v2ex.utils.MessageUtils; import com.yaoyumeng.v2ex.utils.OnScrollToBottomListener; import java.util.ArrayList; /** * 显示单个节点下的话题或最新/最热话题类 */ public class TopicsFragment extends BaseFragment implements HttpRequestHandler<ArrayList<TopicModel>>, OnScrollToBottomListener { public static final int RESULT_ADD_TOPIC = 100; public static final String TAG = "TopicsFragment"; public static final int LatestTopics = 0; public static final int HotTopics = -1; public static final int MyFavoriteTopics = -2; public static final int MyFollowerTopics = -3; public static final int InvalidTopics = -4; int mNodeId = InvalidTopics; //0表示最新话题,-1表示最热话题,-2表示收藏的话题,-3表示我的特别关注,其他表示节点下的话题 int mPage = 1; boolean mNoMore = true; HeaderViewRecyclerAdapter mHeaderAdapter; RecyclerView mRecyclerView; TopicsAdapter mAdapter; RecyclerView.LayoutManager mLayoutManager; SwipeRefreshLayout mSwipeLayout; FloatingActionButton mAddButton; boolean mIsLoading; boolean mAttachMain; NodeModel mNode; String mNodeName; String mTabName; MenuItem mStarItem; MenuItem mUnStarItem; boolean mIsStarred; boolean mShowMenu; V2EXDataSource mDataSource = Application.getDataSource(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Bundle args = getArguments(); mAttachMain = args.getBoolean("attach_main", false); mNodeId = args.getInt("node_id", InvalidTopics); mNodeName = args.getString("node_name", ""); mShowMenu = args.getBoolean("show_menu", false); mTabName = args.getString("tab", ""); setHasOptionsMenu(mShowMenu); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_topics, container, false); mAddButton = (FloatingActionButton) rootView.findViewById(R.id.add_topic_button); mRecyclerView = (RecyclerView) rootView.findViewById(R.id.list_topics); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); if (Application.getInstance().isShowEffectFromCache()) { JazzyRecyclerViewScrollListener scrollListener = new JazzyRecyclerViewScrollListener(); mRecyclerView.setOnScrollListener(scrollListener); scrollListener.setTransitionEffect(new FadeEffect()); } if ((mNodeId > 0 || !mNodeName.isEmpty()) && mIsLogin) { mAddButton.setVisibility(View.VISIBLE); mAddButton.attachToRecyclerView(mRecyclerView); } else { //mAddButton.hide(false); mAddButton.setVisibility(View.GONE); } mAddButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), TopicAddActivity.class); if (mNode == null) intent.putExtra("node_name", mNodeName); else intent.putExtra("model", (Parcelable) mNode); startActivityForResult(intent, RESULT_ADD_TOPIC); } }); mAdapter = new TopicsAdapter(getActivity(), this); mHeaderAdapter = new HeaderViewRecyclerAdapter(mAdapter); mRecyclerView.setAdapter(mHeaderAdapter); mFootUpdate.init(mHeaderAdapter, LayoutInflater.from(getActivity()), new FootUpdate.LoadMore() { @Override public void loadMore() { requestMoreTopics(); } }); mSwipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); mSwipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mPage = 1; requestTopics(true); } }); mSwipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); mSwipeLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics())); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Bundle args = getArguments(); mSwipeLayout.setRefreshing(true); if (args.containsKey("node_name")) { mNodeName = args.getString("node_name"); requestTopicsByName(false); } else if (args.containsKey("node_id")) { mNodeId = args.getInt("node_id"); requestTopicsById(false); } else if (args.containsKey("model")) { mNode = args.getParcelable("model"); mNodeId = mNode.id; mNodeName = mNode.name; requestTopicsById(false); } else if (args.containsKey("tab")) { mTabName = args.getString("tab"); requestTopicsByTab(false); } else { getActivity().finish(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_ADD_TOPIC) { if (resultCode == Activity.RESULT_OK || data != null) { final TopicModel topic = data.getParcelableExtra("create_result"); mAdapter.update(new ArrayList<TopicModel>() {{ add(topic); }}, true); } } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.node, menu); mStarItem = menu.findItem(R.id.menu_node_star); mUnStarItem = menu.findItem(R.id.menu_node_unstar); if (mShowMenu && mIsLogin) { mIsStarred = mDataSource.isNodeFavorite(mNodeName); mStarItem.setVisible(!mIsStarred); mUnStarItem.setVisible(mIsStarred); } else { mStarItem.setVisible(false); mUnStarItem.setVisible(false); } super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_node_star: case R.id.menu_node_unstar: favoriteNode(); return true; } return super.onOptionsItemSelected(item); } @Override public void onSuccess(ArrayList<TopicModel> data, int totalPages, int currentPage) { mSwipeLayout.setRefreshing(false); mIsLoading = false; mPage = currentPage; mNoMore = totalPages == currentPage; if (data.size() == 0) return; if (mNode == null) mNode = data.get(0).node; if (!mAttachMain && mNodeName.isEmpty()) mNodeName = data.get(0).node.name; mAdapter.insertAtBack(data, currentPage != 1); if (mNoMore) { mFootUpdate.dismiss(); } else { mFootUpdate.showLoading(); } } @Override public void onSuccess(ArrayList<TopicModel> data) { onSuccess(data, 1, 1); } @Override public void onFailure(String error) { mSwipeLayout.setRefreshing(false); mIsLoading = false; MessageUtils.showErrorMessage(getActivity(), error); if (mAdapter.getItemCount() > 0 && !mNoMore) { mFootUpdate.showFail(); } else { mFootUpdate.dismiss(); } } @Override public void onLoadMore() { if (!mNoMore && !mIsLoading) { requestMoreTopics(); } } private void favoriteNode() { showProgress(R.string.fav_nodes_working); V2EXManager.favNodeWithNodeName(getActivity(), mNodeName, new RequestFavNodeHelper()); } private void requestMoreTopics() { mIsLoading = true; if (mNodeId == MyFavoriteTopics) V2EXManager.getMyFavoriteTopics(getActivity(), mPage + 1, true, this); else if(mNodeId == MyFollowerTopics) V2EXManager.getTopicsOfMyFollowers(getActivity(), mPage + 1, true, this); else V2EXManager.getTopicsByNodeName(getActivity(), mNodeName, mPage + 1, true, this); } private void requestTopicsByName(boolean refresh) { V2EXManager.getTopicsByNodeName(getActivity(), mNodeName, mPage, refresh, this); } private void requestTopicsById(boolean refresh) { if (mNodeId == LatestTopics) V2EXManager.getLatestTopics(getActivity(), refresh, this); else if (mNodeId == HotTopics) V2EXManager.getHotTopics(getActivity(), refresh, this); else if (mNodeId == MyFavoriteTopics) V2EXManager.getMyFavoriteTopics(getActivity(), mPage, true, this); else if(mNodeId == MyFollowerTopics) V2EXManager.getTopicsOfMyFollowers(getActivity(), mPage, true, this); else if (mNodeId > 0) V2EXManager.getTopicsByNodeId(getActivity(), mNodeId, refresh, this); } private void requestTopicsByTab(boolean refresh) { if(mTabName.equals("members") && !mIsLogin) onSuccess(new ArrayList<TopicModel>()); else V2EXManager.getTopicsByTab(getActivity(), mTabName, refresh, this); } private void requestTopics(boolean refresh) { if (mIsLoading) return; mIsLoading = true; if (mNodeName != null && !mNodeName.isEmpty()) requestTopicsByName(refresh); else if (mTabName != null && !mTabName.isEmpty()) requestTopicsByTab(refresh); else requestTopicsById(refresh); } private class RequestFavNodeHelper implements HttpRequestHandler<Integer> { @Override public void onSuccess(Integer data) { ((BaseActivity) getActivity()).showProgressBar(false); mIsStarred = data == 200; mStarItem.setVisible(!mIsStarred); mUnStarItem.setVisible(mIsStarred); mDataSource.favoriteNode(mNodeName, mIsStarred); MessageUtils.showToast(getActivity(), getString(mIsStarred ? R.string.fav_nodes_ok : R.string.unfav_nodes_ok)); } @Override public void onSuccess(Integer data, int totalPages, int currentPage) { } @Override public void onFailure(String error) { ((BaseActivity) getActivity()).showProgressBar(false); MessageUtils.showErrorMessage(getActivity(), error); } } }