package com.gh.gamecenter.collection; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.LinearLayout; import com.gh.base.OnListClickListener; import com.gh.base.OnRequestCallBackListener; import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DisplayUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.NewsUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsImage1ViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsImage2ViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsImage3ViewHolder; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.entity.ViewsEntity; import com.gh.gamecenter.manager.VisitManager; import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.ObservableUtil; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.lightgame.adapter.BaseRecyclerAdapter; import com.lightgame.utils.Utils; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import java.util.Locale; import retrofit2.HttpException; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by khy on 18/07/17. */ public class ArticleAdapter extends BaseRecyclerAdapter { private OnRequestCallBackListener mListener; private OnListClickListener mListListener; private List mNewsList; private boolean isLoading; private boolean isOver; private boolean isNetworkError; public ArticleAdapter(Context context, OnRequestCallBackListener listener, OnListClickListener listListener) { super(context); mListListener = listListener; mListener = listener; mNewsList = new ArrayList<>(); } public void addList(final int offset) { if (isLoading) { return; } isLoading = true; RetrofitManager.getInstance(mContext) .getApi() .getCollectionArticle(offset) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response>() { @Override public void onResponse(List response) { super.onResponse(response); Config.filterPluginArticle(response); isLoading = false; if (response.size() != 0) { mNewsList.addAll(response); notifyItemRangeInserted(mNewsList.size() - response.size(), response.size()); } if (offset == 0 && mListener != null) { if (mNewsList.size() == 0) { mListener.loadEmpty(); } else { mListener.loadDone(); } } if (response.size() < 20) { isOver = true; notifyItemChanged(getItemCount() - 1); } // 获取新闻阅读量 getNewsViews(response, offset); } @Override public void onFailure(HttpException e) { super.onFailure(e); isLoading = false; // 网络错误 if (offset == 0) { if (mListener != null) { mListener.loadError(); } } else { Utils.toast(mContext, R.string.loading_failed_hint); isNetworkError = true; notifyItemChanged(getItemCount() - 1); } } }); } // 获取新闻阅读量 private void getNewsViews(final List list, final int start) { if (list == null || list.isEmpty()) { return; } ObservableUtil.computation(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { StringBuilder builder = new StringBuilder(); for (int i = 0, size = list.size(); i < size; i++) { builder.append(list.get(i).getId()); builder.append("-"); } builder.deleteCharAt(builder.length() - 1); String ids = builder.toString(); VisitManager.getInstance().addUrl(ids); subscriber.onNext(ids); subscriber.onCompleted(); } }, new Action1() { @Override public void call(String ids) { RetrofitManager.getInstance(mContext).getData() .getNewsViews(ids) .map(new Func1, String>() { @Override public String call(List list) { for (ViewsEntity viewsEntity : list) { for (NewsEntity newsEntity : mNewsList) { if (viewsEntity.getId().equals(newsEntity.getId())) { newsEntity.setViews(viewsEntity.getViews()); break; } } } return null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { @Override public void onResponse(String response) { notifyItemRangeChanged(start, list.size()); } }); } }); } @Override public int getItemViewType(int position) { if (position == mNewsList.size()) { return ItemViewType.LOADING; } NewsEntity newsEntity = mNewsList.get(position); if (newsEntity.getThumbnail() == null) { return ItemViewType.NEWS_IMAGE1; } if ("4x3".equals(newsEntity.getThumbnail().getType()) && newsEntity.getThumbnail().getUrl().size() == 3) { return ItemViewType.NEWS_IMAGE2; } if ("3x1".equals(newsEntity.getThumbnail().getType())) { return ItemViewType.NEWS_IMAGE3; } return ItemViewType.NEWS_IMAGE1; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { case ItemViewType.NEWS_IMAGE1: view = mLayoutInflater.inflate(R.layout.news_image1_item, parent, false); return new NewsImage1ViewHolder(view, mNewsList, mListListener); case ItemViewType.NEWS_IMAGE2: view = mLayoutInflater.inflate(R.layout.news_image2_item, parent, false); return new NewsImage2ViewHolder(view, mNewsList, mListListener); case ItemViewType.NEWS_IMAGE3: view = mLayoutInflater.inflate(R.layout.news_image3_item, parent, false); return new NewsImage3ViewHolder(view, mNewsList, mListListener); case ItemViewType.LOADING: return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)); default: return null; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case ItemViewType.NEWS_IMAGE1: initNewsImage1ViewHolder((NewsImage1ViewHolder) holder, position); break; case ItemViewType.NEWS_IMAGE2: initNewsImage2ViewHolder((NewsImage2ViewHolder) holder, position); break; case ItemViewType.NEWS_IMAGE3: initNewsImage3ViewHolder((NewsImage3ViewHolder) holder, position); break; case ItemViewType.LOADING: initFooterViewHolder((FooterViewHolder) holder); break; } } @Override public int getItemCount() { if (mNewsList.size() == 0) return 0; return mNewsList.size() + 1; } private void initNewsImage1ViewHolder(final NewsImage1ViewHolder viewHolder, int position) { final NewsEntity newsEntity = mNewsList.get(position); if (newsEntity.getThumbnail() != null && newsEntity.getThumbnail().getUrl() != null) { ImageUtils.Companion.display(viewHolder.thumb, newsEntity.getThumbnail().getUrl().get(0)); } else { ImageUtils.Companion.display(viewHolder.thumb, R.drawable.collection_default_icon); } viewHolder.title.setText(newsEntity.getTitle()); int views = newsEntity.getViews(); if (views == 0) { viewHolder.read.setVisibility(View.GONE); } else { viewHolder.read.setVisibility(View.VISIBLE); viewHolder.read.setText(String.format(Locale.getDefault(), "阅读 %d", views)); } NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position); } private void initNewsImage2ViewHolder(final NewsImage2ViewHolder viewHolder, int position) { final NewsEntity newsEntity = mNewsList.get(position); WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); int width = (outMetrics.widthPixels - DisplayUtils.dip2px(mContext, 56)) / 3; int height = (int) (width * 3 / 4f); LinearLayout.LayoutParams lparams1 = new LinearLayout.LayoutParams(width, height); viewHolder.thumb1.setLayoutParams(lparams1); LinearLayout.LayoutParams lparams2 = new LinearLayout.LayoutParams(width, height); lparams2.leftMargin = DisplayUtils.dip2px(mContext, 8); viewHolder.thumb2.setLayoutParams(lparams2); LinearLayout.LayoutParams lparams3 = new LinearLayout.LayoutParams(width, height); lparams3.leftMargin = DisplayUtils.dip2px(mContext, 8); viewHolder.thumb3.setLayoutParams(lparams3); viewHolder.title.setText(newsEntity.getTitle()); ImageUtils.Companion.display(viewHolder.thumb1, newsEntity.getThumbnail().getUrl().get(0)); ImageUtils.Companion.display(viewHolder.thumb2, newsEntity.getThumbnail().getUrl().get(1)); ImageUtils.Companion.display(viewHolder.thumb3, newsEntity.getThumbnail().getUrl().get(2)); int views = newsEntity.getViews(); if (views == 0) { viewHolder.read.setVisibility(View.GONE); } else { viewHolder.read.setVisibility(View.VISIBLE); viewHolder.read.setText(String.format(Locale.getDefault(), "阅读 %d", views)); } NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position); } private void initNewsImage3ViewHolder(final NewsImage3ViewHolder viewHolder, int position) { final NewsEntity newsEntity = mNewsList.get(position); viewHolder.title.setText(newsEntity.getTitle()); ImageUtils.Companion.getInstance().display(viewHolder.thumb, newsEntity.getThumbnail().getUrl().get(0), mContext.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(mContext, 40)); int views = newsEntity.getViews(); if (views == 0) { viewHolder.read.setVisibility(View.GONE); } else { viewHolder.read.setVisibility(View.VISIBLE); viewHolder.read.setText(String.format(Locale.getDefault(), "阅读 %d", views)); } NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position); } private void initFooterViewHolder(FooterViewHolder viewHolder) { viewHolder.initItemPadding(); if (isNetworkError) { viewHolder.loading.setVisibility(View.GONE); viewHolder.hint.setText(R.string.loading_failed_retry); viewHolder.itemView.setClickable(true); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isNetworkError = false; notifyItemChanged(getItemCount() - 1); addList(mNewsList.size()); } }); } else if (isOver) { viewHolder.loading.setVisibility(View.GONE); viewHolder.hint.setText(R.string.loading_complete); viewHolder.itemView.setClickable(false); } else { viewHolder.loading.setVisibility(View.VISIBLE); viewHolder.hint.setText(R.string.loading); viewHolder.itemView.setClickable(false); } } // 统计新闻阅读量 public void statNewsViews(final NewsEntity newsEntity, final int position) { RetrofitManager.getInstance(mContext).getData().postNewsViews(newsEntity.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { if (response.length() != 0) { try { if ("success".equals(response.getString("status"))) { newsEntity.setViews(newsEntity.getViews() + 1); notifyItemChanged(position); // 更新okhttp缓存数据 VisitManager.updateOkhttpCache(mContext, newsEntity.getId()); } } catch (JSONException e) { e.printStackTrace(); } } } }); } List getDataList() { return mNewsList; } public boolean isOver() { return isOver; } public boolean isLoading() { return isLoading; } public boolean isNetworkError() { return isNetworkError; } }