package com.looklook.xinghongfei.looklook.adapter; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.os.Build; import android.support.v4.app.ActivityOptionsCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.looklook.xinghongfei.looklook.MainActivity; import com.looklook.xinghongfei.looklook.R; import com.looklook.xinghongfei.looklook.activity.TopNewsDescribeActivity; import com.looklook.xinghongfei.looklook.bean.news.NewsBean; import com.looklook.xinghongfei.looklook.config.Config; import com.looklook.xinghongfei.looklook.util.DBUtils; import com.looklook.xinghongfei.looklook.util.DensityUtil; import com.looklook.xinghongfei.looklook.util.DribbbleTarget; import com.looklook.xinghongfei.looklook.util.Help; import com.looklook.xinghongfei.looklook.util.ObservableColorMatrix; import com.looklook.xinghongfei.looklook.widget.BadgedFourThreeImageView; import java.util.ArrayList; public class TopNewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MainActivity.LoadingMore { private static final int TYPE_LOADING_MORE = -1; private static final int TYPE_NORMAL = 1; private boolean loadingMore; private int mImageViewWidth; private int mImageViewHeight; private ArrayList<NewsBean> topNewsItems = new ArrayList<>(); private Context mContext; public TopNewsAdapter(Context context) { this.mContext = context; float width = mContext.getResources().getDimension(R.dimen.image_width); mImageViewWidth = DensityUtil.dip2px(mContext, width); mImageViewHeight = mImageViewWidth * 3 / 4; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case TYPE_NORMAL: return new TopNewsViewHolder(LayoutInflater.from(mContext).inflate(R.layout.topnews_layout_item, parent, false)); case TYPE_LOADING_MORE: return new LoadingMoreHolder(LayoutInflater.from(mContext).inflate(R.layout.infinite_loading, parent, false)); } return null; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { int type = getItemViewType(position); switch (type) { case TYPE_NORMAL: bindViewHolderNormal((TopNewsViewHolder) holder, position); break; case TYPE_LOADING_MORE: bindLoadingViewHold((LoadingMoreHolder) holder, position); break; } } private void bindLoadingViewHold(LoadingMoreHolder holder, int position) { holder.progressBar.setVisibility(loadingMore ? View.VISIBLE : View.INVISIBLE); } private void bindViewHolderNormal(final TopNewsViewHolder holder, final int position) { final NewsBean newsBeanItem = topNewsItems.get(holder.getAdapterPosition()); if (DBUtils.getDB(mContext).isRead(Config.TOPNEWS, newsBeanItem.getTitle(), 1)) { holder.textView.setTextColor(Color.GRAY); holder.sourceTextview.setTextColor(Color.GRAY); } else { holder.textView.setTextColor(Color.BLACK); holder.sourceTextview.setTextColor(Color.BLACK); } holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { DBUtils.getDB(mContext).insertHasRead(Config.ZHIHU, newsBeanItem.getTitle(), 1); holder.textView.setTextColor(Color.GRAY); holder.sourceTextview.setTextColor(Color.GRAY); startTopNewsActivity(newsBeanItem, holder); } }); holder.textView.setText(newsBeanItem.getTitle()); holder.sourceTextview.setText(newsBeanItem.getSource()); holder.linearLayout.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { startTopNewsActivity(newsBeanItem, holder); } }); Glide.with(mContext) .load(newsBeanItem.getImgsrc()) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { if (!newsBeanItem.hasFadedIn) { holder.imageView.setHasTransientState(true); final ObservableColorMatrix cm = new ObservableColorMatrix(); final ObjectAnimator animator = ObjectAnimator.ofFloat(cm, ObservableColorMatrix.SATURATION, 0f, 1f); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { holder.imageView.setColorFilter(new ColorMatrixColorFilter(cm)); } }); animator.setDuration(2000L); animator.setInterpolator(new AccelerateInterpolator()); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); holder.imageView.clearColorFilter(); holder.imageView.setHasTransientState(false); animator.start(); newsBeanItem.hasFadedIn = true; } }); } return false; } }).diskCacheStrategy(DiskCacheStrategy.SOURCE) .centerCrop().override(mImageViewWidth, mImageViewHeight) .into(new DribbbleTarget(holder.imageView, false)); } private void startTopNewsActivity(NewsBean newsBeanItem, RecyclerView.ViewHolder holder) { Intent intent = new Intent(mContext, TopNewsDescribeActivity.class); intent.putExtra("docid", newsBeanItem.getDocid()); intent.putExtra("title", newsBeanItem.getTitle()); intent.putExtra("image", newsBeanItem.getImgsrc()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { final android.support.v4.util.Pair<View, String>[] pairs = Help.createSafeTransitionParticipants ((Activity) mContext, false, new android.support.v4.util.Pair<>(((TopNewsViewHolder) holder).imageView, mContext.getString(R.string.transition_topnew)), new android.support.v4.util.Pair<>(((TopNewsViewHolder) holder).linearLayout, mContext.getString(R.string.transition_topnew_linear))); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) mContext, pairs); mContext.startActivity(intent, options.toBundle()); } else { mContext.startActivity(intent); } } @Override public int getItemCount() { return topNewsItems.size(); } public void addItems(ArrayList<NewsBean> list) { list.remove(0); topNewsItems.addAll(list); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if (position < getDataItemCount() && getDataItemCount() > 0) { return TYPE_NORMAL; } return TYPE_LOADING_MORE; } private int getDataItemCount() { return topNewsItems.size(); } private int getLoadingMoreItemPosition() { return loadingMore ? getItemCount() - 1 : RecyclerView.NO_POSITION; } @Override public void loadingStart() { if (loadingMore) return; loadingMore = true; notifyItemInserted(getLoadingMoreItemPosition()); } @Override public void loadingfinish() { if (!loadingMore) return; final int loadingPos = getLoadingMoreItemPosition(); loadingMore = false; notifyItemRemoved(loadingPos); } public void clearData() { topNewsItems.clear(); notifyDataSetChanged(); } private static class LoadingMoreHolder extends RecyclerView.ViewHolder { ProgressBar progressBar; public LoadingMoreHolder(View itemView) { super(itemView); progressBar = (ProgressBar) itemView; } } private static class TopNewsViewHolder extends RecyclerView.ViewHolder { TextView textView; LinearLayout linearLayout; TextView sourceTextview; BadgedFourThreeImageView imageView; TopNewsViewHolder(View itemView) { super(itemView); imageView = (BadgedFourThreeImageView) itemView.findViewById(R.id.item_image_id); textView = (TextView) itemView.findViewById(R.id.item_text_id); linearLayout = (LinearLayout) itemView.findViewById(R.id.zhihu_item_layout); sourceTextview = (TextView) itemView.findViewById(R.id.item_text_source_id); } } }