package com.joker.rxweather.adapter;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.joker.rxweather.R;
import com.joker.rxweather.common.Constants;
import com.joker.rxweather.common.Utils;
import com.joker.rxweather.model.entities.ForecastWeatherEntity;
import java.util.List;
import rx.Observer;
/**
* Created by Joker on 2015/11/3.
*/
public class DetailAdapter extends RecyclerView.Adapter<DetailAdapter.ViewHolder>
implements Observer<List<ForecastWeatherEntity>> {
private Context context;
private List<ForecastWeatherEntity> forecastWeatherEntities;
private boolean animationsLocked = false;
private int lastAnimatedPosition = -1;
public DetailAdapter(Context context) {
this.context = context;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(
LayoutInflater.from(context).inflate(R.layout.i_detail_item, parent, false));
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
DetailAdapter.this.bindValue(holder, forecastWeatherEntities.get(position));
DetailAdapter.this.runEnterAnimation(holder.itemView, position);
}
private void bindValue(ViewHolder holder, ForecastWeatherEntity entity) {
holder.dateTv.setText(entity.getDate());
holder.windTv.setText(entity.getWindDescription());
holder.dayTv.setText(entity.getDayText());
holder.nightTv.setText(entity.getNightText());
holder.dayDegreeTv.setText(Utils.formatTemp(entity.getMaxTemp()));
holder.nightDegreeTv.setText(Utils.formatTemp(entity.getMinTemp()));
Glide.with(context)
.load(Constants.ICON_URL + entity.getDayCode() + ".png")
.dontAnimate()
.placeholder(R.drawable.holding_icon)
.error(R.drawable.holding_icon)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(holder.dayIv);
Glide.with(context)
.load(Constants.ICON_URL + entity.getNightCode() + ".png")
.dontAnimate()
.placeholder(R.drawable.holding_icon)
.error(R.drawable.holding_icon)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(holder.nightIv);
}
private void runEnterAnimation(View itemView, int position) {
if (animationsLocked) return;
if (position > lastAnimatedPosition) {
DetailAdapter.this.lastAnimatedPosition = position;
ViewCompat.setTranslationY(itemView, 100);
ViewCompat.setAlpha(itemView, 0.0f);
ViewCompat.animate(itemView)
.translationY(0.0f)
.alpha(1.0f)
.setStartDelay(position * 20)
.setInterpolator(new DecelerateInterpolator(2.0f))
.setDuration(Constants.MILLISECONDS_300)
.withLayer()
.setListener(new ViewPropertyAnimatorListenerAdapter() {
@Override public void onAnimationEnd(View view) {
DetailAdapter.this.animationsLocked = true;
}
})
.start();
}
}
@Override public int getItemCount() {
return (this.forecastWeatherEntities != null) ? this.forecastWeatherEntities.size() : 0;
}
@Override public void onCompleted() {
/*never invoked*/
}
@Override public void onError(Throwable e) {
e.printStackTrace();
}
@Override public void onNext(List<ForecastWeatherEntity> mainEntities) {
this.forecastWeatherEntities = mainEntities;
DetailAdapter.this.notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
@Nullable @Bind(R.id.detail_item_date_tv) TextView dateTv;
@Nullable @Bind(R.id.detail_item_wind_tv) TextView windTv;
@Nullable @Bind(R.id.detail_item_weather_day_tv) TextView dayTv;
@Nullable @Bind(R.id.detail_item_weather_day_degree_tv) TextView dayDegreeTv;
@Nullable @Bind(R.id.detail_item_weather_day_iv) ImageView dayIv;
@Nullable @Bind(R.id.detail_item_weather_night_tv) TextView nightTv;
@Nullable @Bind(R.id.detail_item_weather_night_degree_tv) TextView nightDegreeTv;
@Nullable @Bind(R.id.detail_item_weather_night_iv) ImageView nightIv;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(ViewHolder.this, itemView);
}
}
}