package com.dxjia.doubantop.views; import android.annotation.TargetApi; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.dxjia.doubantop.R; import com.dxjia.doubantop.datas.beans.entities.CelebrityEntity; import com.dxjia.doubantop.net.DoubanApiUtils; import com.dxjia.doubantop.net.RetrofitCallback; import com.squareup.picasso.Picasso; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by 德祥 on 2015/6/29. * 用来显示影人信息 */ public class PeopleView extends RelativeLayout { @InjectView(R.id.people_area) LinearLayout mPeopleArea; @InjectView(R.id.people_name) TextView mPeopleNameTitleView; @InjectView(R.id.people_avator) ImageView mPeopleAvator; Drawable mAvator; // 性别 @InjectView(R.id.gender_area) LinearLayout mGenderArea; @InjectView(R.id.gender_content) TextView mGenderContent; private String mGender; // 星座 @InjectView(R.id.constellation_area) LinearLayout mConstellationArea; @InjectView(R.id.constellation_content) TextView mConstellationContent; private String mConstellation; // 出生日期 @InjectView(R.id.birthday_area) LinearLayout mBirthdayArea; @InjectView(R.id.birthday_content) TextView mBirthdayContent; private String mBirthday; // 出生地 @InjectView(R.id.born_place_area) LinearLayout mBornPlaceArea; @InjectView(R.id.born_place_content) TextView mBornPlaceContent; private String mBornPlace; // 职业 @InjectView(R.id.professions_area) LinearLayout mProfessionsArea; @InjectView(R.id.professions_content) TextView mProfessionsContent; private String mProfessions; // 英文名 @InjectView(R.id.name_en_area) LinearLayout mNameenArea; @InjectView(R.id.name_en_content) TextView mNameenContent; private String mNameen; // 更多中文名 @InjectView(R.id.aka_cn_area) LinearLayout mAkacnArea; @InjectView(R.id.aka_cn_content) TextView mAkacnContent; private String mAkacn; private DetailsUpdateHandler mDetailsUpdateHandler; private CelebrityEntity mCelebrityEntity; public PeopleView(Context context) { super(context); } public PeopleView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.people_view_layout, this); ButterKnife.inject(this, view); init(); mDetailsUpdateHandler = new DetailsUpdateHandler(context); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public PeopleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { // avator setDefaultAvator(); // 性别 setGender(""); // 星座 setConstellation(""); // 出生日期 setBirthday(""); // 出生地 setBornPlace(""); // 职业 setProfessions(""); // 英文名 setNameen(""); // 更多中文名 setAkacn(""); } public void cleanDetails() { init(); } /** * 标题 * @param name */ private void setPeopleNameTitle(String name) { mPeopleNameTitleView.setText(name); } /** * 设置默认的头像显示 */ private void setDefaultAvator() { Drawable avator = getContext().getResources().getDrawable(R.mipmap.ic_unkown_image); setAvator(avator); } /** * 设置头像 */ public void setAvator(Drawable avator) { mAvator = avator; mPeopleAvator.setImageDrawable(mAvator); } /** * 设置性别 * @param gender */ public void setGender(String gender) { mGender = gender; if (TextUtils.isEmpty(mGender)) { mGenderArea.setVisibility(GONE); } else { mGenderArea.setVisibility(VISIBLE); mGenderContent.setText(mGender); } } /** * 设置星座 * @param constellation */ public void setConstellation(String constellation) { mConstellation = constellation; if (TextUtils.isEmpty(mConstellation)) { mConstellationArea.setVisibility(GONE); } else { mConstellationArea.setVisibility(VISIBLE); mConstellationContent.setText(mConstellation); } } /** * 设置生日 * @param birthday */ public void setBirthday(String birthday) { mBirthday = birthday; if (TextUtils.isEmpty(mBirthday)) { mBirthdayArea.setVisibility(GONE); } else { mBirthdayArea.setVisibility(VISIBLE); mBirthdayContent.setText(mBirthday); } } /** * 设置出生地 * @param bornPlace */ public void setBornPlace(String bornPlace) { mBornPlace = bornPlace; if (TextUtils.isEmpty(mBornPlace)) { mBornPlaceArea.setVisibility(GONE); } else { mBornPlaceArea.setVisibility(VISIBLE); mBornPlaceContent.setText(mBornPlace); } } /** * 设置职业 * @param professions */ public void setProfessions(String professions) { mProfessions = professions; if (TextUtils.isEmpty(mProfessions)) { mProfessionsArea.setVisibility(GONE); } else { mProfessionsArea.setVisibility(VISIBLE); mProfessionsContent.setText(mProfessions); } } /** * 设置英文名 * @param nameen */ public void setNameen(String nameen) { mNameen = nameen; if (TextUtils.isEmpty(mNameen)) { mNameenArea.setVisibility(GONE); } else { mNameenArea.setVisibility(VISIBLE); mNameenContent.setText(mNameen); } } /** * 设置更多中文名 * @param akacn */ public void setAkacn(String akacn) { mAkacn = akacn; if (TextUtils.isEmpty(mAkacn)) { mAkacnArea.setVisibility(GONE); } else { mAkacnArea.setVisibility(VISIBLE); mAkacnContent.setText(mAkacn); } } /** * 设置这个VIEW对应的影人id以及其图像uri * 目前的做法是把具体影人信息的获取放在这个view里触发 * 这样是不是不太好呢,跟UI耦合到一块去啦 * @param id * @param imageUri */ public void setPeopleInfo(String id, String imageUri) { // 更新头像 updatePeopleAvator(imageUri); // 更新详情 updateDetails(id); } private void updatePeopleAvator(String imageUri) { Context context = mPeopleAvator.getContext(); if (TextUtils.isEmpty(imageUri)) { Picasso.with(context) .load(R.mipmap.ic_unkown_image) .resize(140, 200) .centerCrop() .into(mPeopleAvator); return; } Picasso.with(context) .load(imageUri) .placeholder(R.mipmap.ic_loading) .error(R.mipmap.ic_unkown_image) .resize(140, 200) .centerCrop() .into(mPeopleAvator); } /** * 豆瓣提供的API很坑,影人API只能返回有限的信息 * 像星座、职业、出生日期等豆瓣都做了限制,普通的开发者这些都给屏蔽啦 * * 坑~~~ * * @param id */ private void updateDetails(String id) { if (TextUtils.isEmpty(id)) { Log.e("PeoPleView", "null id when update details"); mPeopleNameTitleView.setText("Unkown"); return; } int celebrityId = Integer.valueOf(id); DoubanApiUtils.getMovieApiService().getCelebrityDetails(celebrityId, DoubanApiUtils.API_KEY, new RetrofitCallback<>(mDetailsUpdateHandler, EVENT_UPDATE_DONE, EVENT_UPDATE_FAILED, CelebrityEntity.class)); } private static final int EVENT_UPDATE_FAILED = 102; private static final int EVENT_UPDATE_DONE = 103; /** * UI update handler */ private class DetailsUpdateHandler extends Handler { private final Context mContext; public DetailsUpdateHandler(Context context) { mContext = context; } @Override public void handleMessage(Message msg) { switch (msg.what) { case EVENT_UPDATE_FAILED: break; case EVENT_UPDATE_DONE: if (msg.obj == null) { break; } mCelebrityEntity = (CelebrityEntity) msg.obj; setPeopleNameTitle(mCelebrityEntity.getName()); setGender(mCelebrityEntity.getGender()); setBornPlace(mCelebrityEntity.getBorn_place()); setNameen(mCelebrityEntity.getName_en()); setAkacn(mCelebrityEntity.getAkaStr()); break; } super.handleMessage(msg); } } }