package com.socks.jiandan.adapter; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Typeface; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; import com.android.volley.Response; import com.android.volley.VolleyError; import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.socks.jiandan.R; import com.socks.jiandan.base.BaseActivity; import com.socks.jiandan.base.ConstantString; import com.socks.jiandan.base.JDApplication; import com.socks.jiandan.cache.PictureCache; import com.socks.jiandan.callback.LoadFinishCallBack; import com.socks.jiandan.callback.LoadResultCallBack; import com.socks.jiandan.model.CommentNumber; import com.socks.jiandan.model.Picture; import com.socks.jiandan.net.JSONParser; import com.socks.jiandan.net.Request4CommentCounts; import com.socks.jiandan.net.Request4Picture; import com.socks.jiandan.net.RequestManager; import com.socks.jiandan.ui.CommentListActivity; import com.socks.jiandan.ui.ImageDetailActivity; import com.socks.jiandan.utils.FileUtil; import com.socks.jiandan.utils.NetWorkUtil; import com.socks.jiandan.utils.ShareUtil; import com.socks.jiandan.utils.ShowToast; import com.socks.jiandan.utils.String2TimeUtil; import com.socks.jiandan.utils.TextUtil; import com.socks.jiandan.view.ShowMaxImageView; import com.socks.jiandan.view.imageloader.ImageLoadProxy; import java.util.ArrayList; import butterknife.ButterKnife; import butterknife.InjectView; public class PictureAdapter extends RecyclerView.Adapter<PictureAdapter.PictureViewHolder> { private int page; private int lastPosition = -1; private ArrayList<Picture> pictures; private LoadFinishCallBack mLoadFinisCallBack; private LoadResultCallBack mLoadResultCallBack; private Activity mActivity; private boolean isWifiConnected; private Picture.PictureType mType; private LoadFinishCallBack mSaveFileCallBack; public PictureAdapter(Activity activity, LoadResultCallBack loadResultCallBack, LoadFinishCallBack loadFinisCallBack, Picture.PictureType type) { mActivity = activity; mType = type; mLoadFinisCallBack = loadFinisCallBack; mLoadResultCallBack = loadResultCallBack; pictures = new ArrayList<>(); isWifiConnected = NetWorkUtil.isWifiConnected(mActivity); } private void setAnimation(View viewToAnimate, int position) { if (position > lastPosition) { Animation animation = AnimationUtils.loadAnimation(viewToAnimate.getContext(), R .anim.item_bottom_in); viewToAnimate.startAnimation(animation); lastPosition = position; } } @Override public void onViewDetachedFromWindow(PictureViewHolder holder) { super.onViewDetachedFromWindow(holder); holder.card.clearAnimation(); } @Override public PictureViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_pic, parent, false); return new PictureViewHolder(v); } @Override public void onBindViewHolder(final PictureViewHolder holder, final int position) { final Picture picture = pictures.get(position); String picUrl = picture.getPics()[0]; if (picUrl.endsWith(".gif")) { holder.img_gif.setVisibility(View.VISIBLE); //非WIFI网络情况下,GIF图只加载缩略图,详情页才加载真实图片 if (!isWifiConnected) { picUrl = picUrl.replace("mw600", "small").replace("mw1200", "small").replace ("large", "small"); } } else { holder.img_gif.setVisibility(View.GONE); } holder.progress.setProgress(0); holder.progress.setVisibility(View.VISIBLE); ImageLoadProxy.displayImageList(picUrl, holder.img, R.drawable.ic_loading_large, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); holder.progress.setVisibility(View.GONE); } }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { holder.progress.setProgress((int) (current * 100f / total)); } }); if (TextUtil.isNull(picture.getText_content().trim())) { holder.tv_content.setVisibility(View.GONE); } else { holder.tv_content.setVisibility(View.VISIBLE); holder.tv_content.setText(picture.getText_content().trim()); } holder.img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mActivity, ImageDetailActivity.class); intent.putExtra(BaseActivity.DATA_IMAGE_AUTHOR, picture.getComment_author()); intent.putExtra(BaseActivity.DATA_IMAGE_URL, picture.getPics()); intent.putExtra(BaseActivity.DATA_IMAGE_ID, picture.getComment_ID()); intent.putExtra(BaseActivity.DATA_THREAD_KEY, "comment-" + picture.getComment_ID()); if (picture.getPics()[0].endsWith(".gif")) { intent.putExtra(BaseActivity.DATA_IS_NEED_WEBVIEW, true); } mActivity.startActivity(intent); } }); holder.tv_author.setText(picture.getComment_author()); holder.tv_time.setText(String2TimeUtil.dateString2GoodExperienceFormat(picture.getComment_date())); holder.tv_like.setText(picture.getVote_positive()); holder.tv_comment_count.setText(picture.getComment_counts()); //用于恢复默认的文字 holder.tv_like.setTypeface(Typeface.DEFAULT); holder.tv_like.setTextColor(mActivity.getResources().getColor(R.color .secondary_text_default_material_light)); holder.tv_support_des.setTextColor(mActivity.getResources().getColor(R.color .secondary_text_default_material_light)); holder.tv_unlike.setText(picture.getVote_negative()); holder.tv_unlike.setTypeface(Typeface.DEFAULT); holder.tv_unlike.setTextColor(mActivity.getResources().getColor(R.color .secondary_text_default_material_light)); holder.tv_un_support_des.setTextColor(mActivity.getResources().getColor(R.color .secondary_text_default_material_light)); holder.img_share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new MaterialDialog.Builder(mActivity) .items(R.array.picture_dialog) .backgroundColor(mActivity.getResources().getColor(JDApplication.COLOR_OF_DIALOG)) .contentColor(JDApplication.COLOR_OF_DIALOG_CONTENT) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { switch (which) { //分享 case 0: ShareUtil.sharePicture(mActivity, picture .getPics()[0]); break; //保存 case 1: FileUtil.savePicture(mActivity, picture .getPics()[0],mSaveFileCallBack); break; } } }) .show(); } }); holder.ll_comment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mActivity, CommentListActivity.class); intent.putExtra(BaseActivity.DATA_THREAD_KEY, "comment-" + picture.getComment_ID()); mActivity.startActivity(intent); } }); setAnimation(holder.card, position); } @Override public int getItemCount() { return pictures.size(); } public void loadFirst() { page = 1; loadDataByNetworkType(); } public void loadNextPage() { page++; loadDataByNetworkType(); } private void loadDataByNetworkType() { if (NetWorkUtil.isNetWorkConnected(mActivity)) { loadData(); } else { loadCache(); } } private void loadData() { RequestManager.addRequest(new Request4Picture(Picture.getRequestUrl(mType, page), new Response.Listener<ArrayList<Picture>> () { @Override public void onResponse(ArrayList<Picture> response) { getCommentCounts(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mLoadResultCallBack.onError(LoadResultCallBack.ERROR_NET, error.getMessage()); mLoadFinisCallBack.loadFinish(null); } }), mActivity); } private void loadCache() { mLoadResultCallBack.onSuccess(LoadResultCallBack.SUCCESS_OK, null); mLoadFinisCallBack.loadFinish(null); PictureCache pictureCacheUtil = PictureCache.getInstance(mActivity); if (page == 1) { pictures.clear(); ShowToast.Short(ConstantString.LOAD_NO_NETWORK); } pictures.addAll(pictureCacheUtil.getCacheByPage(page)); notifyDataSetChanged(); } private void getCommentCounts(final ArrayList<Picture> pictures) { StringBuilder sb = new StringBuilder(); for (Picture joke : pictures) { sb.append("comment-" + joke.getComment_ID() + ","); } RequestManager.addRequest(new Request4CommentCounts(CommentNumber.getCommentCountsURL(sb.toString()), new Response .Listener<ArrayList<CommentNumber>>() { @Override public void onResponse(ArrayList<CommentNumber> response) { mLoadResultCallBack.onSuccess(LoadResultCallBack.SUCCESS_OK, null); mLoadFinisCallBack.loadFinish(null); for (int i = 0; i < pictures.size(); i++) { pictures.get(i).setComment_counts(response.get(i).getComments() + ""); } if (page == 1) { PictureAdapter.this.pictures.clear(); PictureCache.getInstance(mActivity).clearAllCache(); } PictureAdapter.this.pictures.addAll(pictures); notifyDataSetChanged(); //加载完毕后缓存 PictureCache.getInstance(mActivity).addResultCache(JSONParser.toString (pictures), page); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ShowToast.Short(ConstantString.LOAD_FAILED); mLoadFinisCallBack.loadFinish(null); mLoadResultCallBack.onError(LoadResultCallBack.ERROR_NET, error.getMessage()); } } ), mActivity); } public void setIsWifi(boolean isWifiConnected) { this.isWifiConnected = isWifiConnected; } public void setmSaveFileCallBack(LoadFinishCallBack mSaveFileCallBack) { this.mSaveFileCallBack = mSaveFileCallBack; } public static class PictureViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.tv_author) TextView tv_author; @InjectView(R.id.tv_time) TextView tv_time; @InjectView(R.id.tv_content) TextView tv_content; @InjectView(R.id.tv_like) TextView tv_like; @InjectView(R.id.tv_unlike) TextView tv_unlike; @InjectView(R.id.tv_comment_count) TextView tv_comment_count; @InjectView(R.id.tv_unsupport_des) TextView tv_un_support_des; @InjectView(R.id.tv_support_des) TextView tv_support_des; @InjectView(R.id.img_share) ImageView img_share; @InjectView(R.id.img_gif) ImageView img_gif; @InjectView(R.id.img) ShowMaxImageView img; @InjectView(R.id.ll_comment) LinearLayout ll_comment; @InjectView(R.id.progress) ProgressBar progress; @InjectView(R.id.card) CardView card; public PictureViewHolder(View contentView) { super(contentView); ButterKnife.inject(this, contentView); } } }