384 lines
15 KiB
Java
384 lines
15 KiB
Java
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<NewsEntity> 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<List<NewsEntity>>() {
|
|
@Override
|
|
public void onResponse(List<NewsEntity> 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<NewsEntity> list, final int start) {
|
|
if (list == null || list.isEmpty()) {
|
|
return;
|
|
}
|
|
ObservableUtil.computation(new Observable.OnSubscribe<String>() {
|
|
@Override
|
|
public void call(Subscriber<? super String> 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<String>() {
|
|
@Override
|
|
public void call(String ids) {
|
|
RetrofitManager.getInstance(mContext).getData()
|
|
.getNewsViews(ids)
|
|
.map(new Func1<List<ViewsEntity>, String>() {
|
|
@Override
|
|
public String call(List<ViewsEntity> 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<String>() {
|
|
@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<NewsEntity> getDataList() {
|
|
return mNewsList;
|
|
}
|
|
|
|
public boolean isOver() {
|
|
return isOver;
|
|
}
|
|
|
|
public boolean isLoading() {
|
|
return isLoading;
|
|
}
|
|
|
|
public boolean isNetworkError() {
|
|
return isNetworkError;
|
|
}
|
|
}
|