package com.android.ted.gank.adapter;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.ted.gank.R;
import com.android.ted.gank.data.ImageGoodsCache;
import com.android.ted.gank.db.Image;
import com.android.ted.gank.manager.CollectManager;
import com.android.ted.gank.model.Goods;
import com.android.ted.gank.utils.Utils;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.Date;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by froger_mcs on 05.11.14.
*/
public class GoodsItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
private static final DecelerateInterpolator DECCELERATE_INTERPOLATOR = new DecelerateInterpolator();
private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4);
private static final int ANIMATED_ITEMS_COUNT = 3;
private Context context;
private int lastAnimatedPosition = -1;
private boolean animateItems = false;
private ArrayList<Goods> goodsItemData;
public GoodsItemAdapter(Context context) {
this.context = context;
goodsItemData = new ArrayList<>();
}
@Override
public void onClick(View view) {
final int viewId = view.getId();
if(viewId == R.id.img_like_goods){
}
}
private View.OnClickListener mItemOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Integer position = (Integer)view.getTag();
Goods goods = goodsItemData.get(position.intValue());
Intent intent= new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(goods.getUrl());
intent.setData(content_url);
view.getContext().startActivity(intent);
}
};
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(context).inflate(R.layout.goods_item_layout, parent, false);
final CellGoodsViewHolder cellGoodsViewHolder = new CellGoodsViewHolder(view);
cellGoodsViewHolder.imgLikeGoods.setOnClickListener(this);
cellGoodsViewHolder.rootView.setOnClickListener(mItemOnClickListener);
return cellGoodsViewHolder;
}
private void runEnterAnimation(View view, int position) {
if (!animateItems || position >= ANIMATED_ITEMS_COUNT - 1) {
return;
}
if (position > lastAnimatedPosition) {
lastAnimatedPosition = position;
view.setTranslationY(Utils.getScreenHeight(context));
view.animate()
.translationY(0)
.setInterpolator(new DecelerateInterpolator(3.f))
.setDuration(700)
.start();
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
runEnterAnimation(viewHolder.itemView, position);
final CellGoodsViewHolder holder = (CellGoodsViewHolder) viewHolder;
bindGoodsItem(position, holder);
}
private void bindGoodsItem(int position, CellGoodsViewHolder holder) {
Goods goods = goodsItemData.get(position);
Image image = ImageGoodsCache.getIns().getImgGoodsRandom(position);
boolean hasImg = null != image;
holder.txtGoodsTitle.setText("#"+goods.getDesc());
holder.txtImgAuthor.setText(hasImg?"图:"+image.getWho():"");
holder.txtGoodsAuthor.setText(getGoodsAuthorInfo(goods));
loadGoodsImage(holder, image);
updateHeartButton(holder, goods, false);
holder.imgLikeGoods.setTag(holder);
holder.rootView.setTag(position);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return goodsItemData.size();
}
private String getGoodsAuthorInfo(Goods goods){
StringBuilder builder = new StringBuilder();
Date date = Utils.formatDateFromStr(goods.getPublishedAt());
String dateStr = Utils.getFormatDateStr(date);
builder.append(goods.getWho()).append(TextUtils.isEmpty(dateStr)?"":"@"+dateStr);
return builder.toString();
}
private void loadGoodsImage(final CellGoodsViewHolder holder,Image imgGoods){
if(null == imgGoods || TextUtils.isEmpty(imgGoods.getUrl())){
Glide.with(context)
.load(R.drawable.item_default_img)
.centerCrop()
.into(holder.imgGoodsImageBg);
}else {
Glide.with(context)
.load(imgGoods.getUrl())
.centerCrop()
.into(holder.imgGoodsImageBg);
}
}
private void updateHeartButton(final CellGoodsViewHolder holder,Goods goods, boolean animated) {
if (animated) {
if (!CollectManager.getIns().isCollect(goods)) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.imgLikeGoods, "rotation", 0f, 360f);
rotationAnim.setDuration(300);
rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.imgLikeGoods, "scaleX", 0.2f, 1f);
bounceAnimX.setDuration(300);
bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);
ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.imgLikeGoods, "scaleY", 0.2f, 1f);
bounceAnimY.setDuration(300);
bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
bounceAnimY.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
holder.imgLikeGoods.setImageResource(R.drawable.ic_heart_red);
}
});
animatorSet.play(rotationAnim);
animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//resetLikeAnimationState(holder);
}
});
animatorSet.start();
}else {
}
} else {
if (CollectManager.getIns().isCollect(goods)) {
holder.imgLikeGoods.setImageResource(R.drawable.ic_heart_red);
} else {
holder.imgLikeGoods.setImageResource(R.drawable.ic_heart_outline_grey);
}
}
}
private void animatePhotoLike(final CellGoodsViewHolder holder) {
// if (!likeAnimations.containsKey(holder)) {
// holder.vBgLike.setVisibility(View.VISIBLE);
// holder.ivLike.setVisibility(View.VISIBLE);
//
// holder.vBgLike.setScaleY(0.1f);
// holder.vBgLike.setScaleX(0.1f);
// holder.vBgLike.setAlpha(1f);
// holder.ivLike.setScaleY(0.1f);
// holder.ivLike.setScaleX(0.1f);
//
// AnimatorSet animatorSet = new AnimatorSet();
// likeAnimations.put(holder, animatorSet);
//
// ObjectAnimator bgScaleYAnim = ObjectAnimator.ofFloat(holder.vBgLike, "scaleY", 0.1f, 1f);
// bgScaleYAnim.setDuration(200);
// bgScaleYAnim.setInterpolator(DECCELERATE_INTERPOLATOR);
// ObjectAnimator bgScaleXAnim = ObjectAnimator.ofFloat(holder.vBgLike, "scaleX", 0.1f, 1f);
// bgScaleXAnim.setDuration(200);
// bgScaleXAnim.setInterpolator(DECCELERATE_INTERPOLATOR);
// ObjectAnimator bgAlphaAnim = ObjectAnimator.ofFloat(holder.vBgLike, "alpha", 1f, 0f);
// bgAlphaAnim.setDuration(200);
// bgAlphaAnim.setStartDelay(150);
// bgAlphaAnim.setInterpolator(DECCELERATE_INTERPOLATOR);
//
// ObjectAnimator imgScaleUpYAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleY", 0.1f, 1f);
// imgScaleUpYAnim.setDuration(300);
// imgScaleUpYAnim.setInterpolator(DECCELERATE_INTERPOLATOR);
// ObjectAnimator imgScaleUpXAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleX", 0.1f, 1f);
// imgScaleUpXAnim.setDuration(300);
// imgScaleUpXAnim.setInterpolator(DECCELERATE_INTERPOLATOR);
//
// ObjectAnimator imgScaleDownYAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleY", 1f, 0f);
// imgScaleDownYAnim.setDuration(300);
// imgScaleDownYAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
// ObjectAnimator imgScaleDownXAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleX", 1f, 0f);
// imgScaleDownXAnim.setDuration(300);
// imgScaleDownXAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
//
// animatorSet.playTogether(bgScaleYAnim, bgScaleXAnim, bgAlphaAnim, imgScaleUpYAnim, imgScaleUpXAnim);
// animatorSet.play(imgScaleDownYAnim).with(imgScaleDownXAnim).after(imgScaleUpYAnim);
//
// animatorSet.addListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationEnd(Animator animation) {
// resetLikeAnimationState(holder);
// }
// });
// animatorSet.start();
// }
}
public void updateItems(ArrayList<Goods> goods,boolean animated) {
goodsItemData.clear();
goodsItemData.addAll(goods);
animateItems = animated;
notifyDataSetChanged();
}
public static class CellGoodsViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.img_goods_img)
ImageView imgGoodsImageBg;
@Bind(R.id.txt_img_author)
TextView txtImgAuthor;
@Bind(R.id.txt_goods_title)
TextView txtGoodsTitle;
@Bind(R.id.img_like_goods)
ImageView imgLikeGoods;
@Bind(R.id.txt_goods_author)
TextView txtGoodsAuthor;
public final View rootView;
public CellGoodsViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
rootView = view;
}
}
}