package com.dxjia.doubantop.fragments; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.view.View; import android.widget.LinearLayout; import android.widget.RatingBar; import android.widget.TextView; import com.dxjia.doubantop.R; import com.dxjia.doubantop.datas.beans.BeansUtils; import com.dxjia.doubantop.datas.beans.MovieMajorInfos; import com.dxjia.doubantop.datas.beans.entities.SurveyEntity; import com.dxjia.doubantop.net.DoubanApiUtils; import com.dxjia.doubantop.net.RetrofitCallback; import com.dxjia.doubantop.views.PeopleView; import java.util.ArrayList; import java.util.List; import butterknife.InjectView; /** * Created by 德祥 on 2015/7/14. */ public class DetailContentsFragment extends BaseFragment { private static final int EVENT_UPDATE_START = 1; private static final int EVENT_UPDATE_FAILED = 2; private static final int EVENT_UPDATE_DONE = 3; @InjectView(R.id.refresh_layout) SwipeRefreshLayout mSwipeRefreshLayout; @InjectView(R.id.details_content) LinearLayout mWholeContentArea; // 评分 @InjectView(R.id.score_area) LinearLayout mScoreArea; @InjectView(R.id.rating_bar) RatingBar mScoreRatingBar; @InjectView(R.id.score_text) TextView mScoreTextView; // 导演 @InjectView(R.id.director_area) LinearLayout mDirectorArea; @InjectView(R.id.director) PeopleView mDirectorView; // 主演 // 因为豆瓣API的限制,我们只能拿到最多3个主演信息,真抠门。 private final static int MAX_CASTS_COUNT = 3; @InjectView(R.id.casts_area) LinearLayout mCastsArea; @InjectView(R.id.casts_1) PeopleView mCastsView1; @InjectView(R.id.casts_2) PeopleView mCastsView2; @InjectView(R.id.casts_3) PeopleView mCastsView3; // 内容简介 @InjectView(R.id.summary_area) LinearLayout mSummaryArea; @InjectView(R.id.movie_summary) TextView mSummaryTextView; private String mSummary = ""; private MovieMajorInfos mMovieInfos = null; private UpdateHandler mUpdateHandler; @Override protected int getLayout() { return R.layout.detail_contents_fragment; } public static DetailContentsFragment newInstance(MovieMajorInfos movieInfos) { DetailContentsFragment fragment = new DetailContentsFragment(); Bundle bundle = new Bundle(); if (movieInfos != null) { bundle.putParcelable(BeansUtils.MOVIE_MAJOR_INFOS_KEY, movieInfos); bundle.setClassLoader(movieInfos.getClass().getClassLoader()); fragment.setArguments(bundle); } return fragment; } public DetailContentsFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); if (args != null) { mMovieInfos = args.getParcelable(BeansUtils.MOVIE_MAJOR_INFOS_KEY); } mUpdateHandler = new UpdateHandler(); if (mMovieInfos != null) { mUpdateHandler.sendEmptyMessageDelayed(EVENT_UPDATE_START, 100); } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initSwipRefresh(); // hide first, setup back after we fetched the summary though http hideAllViews(); } public void setRefreshEnable(boolean enable) { if (mSwipeRefreshLayout != null) { mSwipeRefreshLayout.setEnabled(enable); } } private void initSwipRefresh() { mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { cleanViews(); mUpdateHandler.sendEmptyMessage(EVENT_UPDATE_START); } }); } private void setupViews() { if (mMovieInfos == null) { return; } mWholeContentArea.setVisibility(View.VISIBLE); updateScore(mMovieInfos.getMovieScore()); updateDirector(mMovieInfos.getDirectorId(), mMovieInfos.getDirectorImage()); updateCasts(mMovieInfos.getCastsCount(), mMovieInfos.getCastsIds(), mMovieInfos.getCastsImages()); updateMovieSummary(mSummary); } private void hideAllViews() { mWholeContentArea.setVisibility(View.GONE); } private void updateScore(String scoreStr) { if (TextUtils.isEmpty(scoreStr)) { mScoreArea.setVisibility(View.GONE); return; } mScoreArea.setVisibility(View.VISIBLE); mScoreRatingBar.setRating((float) ((double) (Float.valueOf(scoreStr)) / (double) (2))); mScoreTextView.setText(scoreStr); } private void updateDirector(String directorId, String directorImage) { if (TextUtils.isEmpty(directorId) || TextUtils.isEmpty(directorImage)) { mDirectorArea.setVisibility(View.GONE); return; } mDirectorArea.setVisibility(View.VISIBLE); mDirectorView.setPeopleInfo(directorId, directorImage); } private void updateCasts(int castsCount, String[] castsIds, String[] castsImages) { if (castsCount == 0 || castsIds == null) { mCastsArea.setVisibility(View.GONE); return; } int castIdsLen = castsIds.length; int castImagesLen = castsImages != null ? castsImages.length : 0; int temp, count; temp = (castsCount > castIdsLen) ? castIdsLen : castsCount; count = (temp > castImagesLen) ? castImagesLen : temp; if (count > MAX_CASTS_COUNT) { count = MAX_CASTS_COUNT; } if (count == 0) { mCastsArea.setVisibility(View.GONE); return; } mCastsArea.setVisibility(View.VISIBLE); List<PeopleView> viewList = new ArrayList<>(); viewList.add(mCastsView1); viewList.add(mCastsView2); viewList.add(mCastsView3); int i = 0; for (; i < count; i++) { viewList.get(i).setVisibility(View.VISIBLE); viewList.get(i).setPeopleInfo(castsIds[i], castsImages[i]); } for (; i < MAX_CASTS_COUNT; i++) { viewList.get(i).setVisibility(View.GONE); } } private void updateMovieSummary(String summary) { if(TextUtils.isEmpty(summary)) { mSummaryArea.setVisibility(View.GONE); return; } mSummaryArea.setVisibility(View.VISIBLE); mSummaryTextView.setText(summary); } private void cleanViews() { mScoreTextView.setText(""); mDirectorView.cleanDetails(); mCastsView1.cleanDetails(); mCastsView2.cleanDetails(); mCastsView3.cleanDetails(); mSummaryTextView.setText(""); hideAllViews(); } /** * UI update handler */ private class UpdateHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case EVENT_UPDATE_START: mSwipeRefreshLayout.setRefreshing(true); int movieId = Integer.valueOf(mMovieInfos.getMovieId()); // 异步请求数据 DoubanApiUtils.getMovieApiService().getMovieSubject(movieId, DoubanApiUtils.API_KEY, new RetrofitCallback<>(mUpdateHandler, EVENT_UPDATE_DONE, EVENT_UPDATE_FAILED, SurveyEntity.class)); break; case EVENT_UPDATE_FAILED: mSummary = ""; mSwipeRefreshLayout.setRefreshing(false); break; case EVENT_UPDATE_DONE: if (msg.obj != null) { SurveyEntity survey = (SurveyEntity)(msg.obj); mSummary = survey.getSummary(); mSwipeRefreshLayout.setRefreshing(false); setupViews(); } break; } super.handleMessage(msg); } } }