package com.yaoyumeng.v2ex.ui.fragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; 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.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; 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.model.MemberModel; import com.yaoyumeng.v2ex.model.TopicModel; 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 UserFragment extends BaseFragment implements HttpRequestHandler<ArrayList<MemberModel>>, OnScrollToBottomListener { private static final String FIELD_UNSET = "未设置"; private View mHeader; private SwipeRefreshLayout mSwipeLayout; private HeaderViewRecyclerAdapter mHeaderAdapter; private RecyclerView.LayoutManager mLayoutManager; private RecyclerView mRecyclerView; private TopicsAdapter mAdapter; private ImageView mHeaderLogo; private TextView mName; private TextView mDescription; private TextView mTagline; private TextView mWebSite; private TextView mTwitter; private TextView mGithub; private TextView mLocation; private LinearLayout mWebSiteLayout; private LinearLayout mTwitterLayout; private LinearLayout mGithubLayout; private LinearLayout mLocationLayout; private MemberModel mMember; private String mUserName; private int mPage = 1; private boolean mNoMore = true; private Application mApp = Application.getInstance(); private View.OnClickListener layoutClick = new View.OnClickListener() { @Override public void onClick(View v) { if (mMember == null) return; int id = v.getId(); String url = ""; if (id == R.id.github_layout && mMember.github != null && !mMember.github.isEmpty()) { url = "https://github.com/" + mMember.github; } else if (id == R.id.twitter_layout && mMember.twitter != null && !mMember.twitter.isEmpty()) { url = "https://twitter.com/" + mMember.twitter; } else if (id == R.id.homepage_layout && mMember.website != null && !mMember.website.isEmpty()) { url = mMember.website; } if (!url.isEmpty()) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_topics, container, false); mSwipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); mRecyclerView = (RecyclerView) rootView.findViewById(R.id.list_topics); rootView.findViewById(R.id.add_topic_button).setVisibility(View.GONE); mHeader = inflater.inflate(R.layout.fragment_user, container, false); mHeaderLogo = (ImageView) mHeader.findViewById(R.id.header_logo_fragment_user); mName = (TextView) mHeader.findViewById(R.id.txt_fragment_user_name); mTagline = (TextView) mHeader.findViewById(R.id.txt_fragment_user_tagline); mDescription = (TextView) mHeader.findViewById(R.id.txt_fragment_user_description); mWebSite = (TextView) mHeader.findViewById(R.id.title_homepage); mTwitter = (TextView) mHeader.findViewById(R.id.title_twitter_account); mGithub = (TextView) mHeader.findViewById(R.id.title_github_account); mLocation = (TextView) mHeader.findViewById(R.id.title_location); mWebSiteLayout = (LinearLayout) mHeader.findViewById(R.id.homepage_layout); mTwitterLayout = (LinearLayout) mHeader.findViewById(R.id.twitter_layout); mGithubLayout = (LinearLayout) mHeader.findViewById(R.id.github_layout); mLocationLayout = (LinearLayout) mHeader.findViewById(R.id.location_layout); mWebSiteLayout.setOnClickListener(layoutClick); mGithubLayout.setOnClickListener(layoutClick); mTwitterLayout.setOnClickListener(layoutClick); RecyclerView.LayoutParams headerLayoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); mHeader.setLayoutParams(headerLayoutParams); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new TopicsAdapter(getActivity(), this); mHeaderAdapter = new HeaderViewRecyclerAdapter(mAdapter); mHeaderAdapter.addHeaderView(mHeader); mRecyclerView.setAdapter(mHeaderAdapter); mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); mFootUpdate.init(mHeaderAdapter, LayoutInflater.from(getActivity()), new FootUpdate.LoadMore() { @Override public void loadMore() { getTopicsOfNextPage(); } }); if (mApp.isShowEffectFromCache()) { JazzyRecyclerViewScrollListener scrollListener = new JazzyRecyclerViewScrollListener(); mRecyclerView.setOnScrollListener(scrollListener); scrollListener.setTransitionEffect(new FadeEffect()); } return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mSwipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mPage = 1; if (mMember == null) V2EXManager.getMemberInfoByUsername(getActivity(), mUserName, true, UserFragment.this); else getTopicsData(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())); mSwipeLayout.setRefreshing(true); if (getArguments().containsKey("model")) { mMember = getArguments().getParcelable("model"); showData(); } else if (getArguments().containsKey("username")) { mUserName = getArguments().getString("username"); mName.setText(mUserName); mDescription.setText("Loading..."); V2EXManager.getMemberInfoByUsername(getActivity(), mUserName, false, this); } } @Override public void onSuccess(ArrayList<MemberModel> data) { if (data.size() > 0) { mMember = data.get(0); showData(); } else { mSwipeLayout.setRefreshing(false); } } @Override public void onSuccess(ArrayList<MemberModel> data, int total, int current) { } @Override public void onFailure(String error) { mSwipeLayout.setRefreshing(false); MessageUtils.showErrorMessage(getActivity(), error); } @Override public void onLoadMore() { if (!mNoMore && !mApp.isJsonAPIFromCache()) { getTopicsOfNextPage(); } } private void showData() { mName.setText(mMember.username); mTagline.setText(mMember.tagline); mDescription.setText("V2EX 第 " + mMember.id + " 号会员"); ImageLoader.getInstance().displayImage(mMember.avatar, mHeaderLogo); mLocation.setText(mMember.location.isEmpty() ? FIELD_UNSET : mMember.location); mGithub.setText(mMember.github.isEmpty() ? FIELD_UNSET : mMember.github); mTwitter.setText(mMember.twitter.isEmpty() ? FIELD_UNSET : mMember.twitter); mWebSite.setText(mMember.website.isEmpty() ? FIELD_UNSET : mMember.website); getTopicsData(true); } private void getTopicsOfNextPage() { V2EXManager.getTopicsByUsernameThroughBrowser(getActivity(), mUserName, mPage + 1, new RequestTopicHelper()); } private void getTopicsData(boolean refresh) { if (mApp.isJsonAPIFromCache()) V2EXManager.getTopicsByUsername(getActivity(), mUserName, refresh, new RequestTopicHelper()); else V2EXManager.getTopicsByUsernameThroughBrowser(getActivity(), mUserName, 1, new RequestTopicHelper()); } class RequestTopicHelper implements HttpRequestHandler<ArrayList<TopicModel>> { @Override public void onSuccess(ArrayList<TopicModel> data) { onSuccess(data, 1, 1); } @Override public void onSuccess(ArrayList<TopicModel> data, int totalPages, int currentPage) { mPage = currentPage; mNoMore = totalPages == currentPage; mSwipeLayout.setRefreshing(false); if (!mApp.isJsonAPIFromCache()) { for (TopicModel topic : data) topic.member = mMember; } mAdapter.insertAtBack(data, currentPage != 1); if (mNoMore) { mFootUpdate.dismiss(); } else { mFootUpdate.showLoading(); } } @Override public void onFailure(String error) { mSwipeLayout.setRefreshing(false); MessageUtils.showErrorMessage(getActivity(), error); if (mAdapter.getItemCount() > 0 && !mNoMore) { mFootUpdate.showFail(); } else { mFootUpdate.dismiss(); } } } }