Files
assistant-android/app/src/main/java/com/gh/gamecenter/collection/ArticleAdapter.java
2020-05-28 10:30:35 +08:00

271 lines
12 KiB
Java

package com.gh.gamecenter.collection;
import android.content.Context;
import android.graphics.Paint;
import android.text.TextUtils;
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.common.constant.ItemViewType;
import com.gh.common.util.DialogHelper;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.util.NumberUtils;
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.baselist.ListAdapter;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.manager.VisitManager;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.RetrofitManager;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Locale;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* Created by khy on 18/07/17.
*/
public class ArticleAdapter extends ListAdapter<NewsEntity> {
private OnListClickListener mListListener;
private ArticleViewModel mViewModel;
public ArticleAdapter(Context context, ArticleViewModel viewModel, OnListClickListener listListener) {
super(context);
mViewModel = viewModel;
mListListener = listListener;
}
@Override
protected boolean areItemsTheSame(NewsEntity oldItem, NewsEntity newItem) {
return !TextUtils.isEmpty(oldItem.getId()) && oldItem.getId().equals(newItem.getId());
}
@Override
protected boolean areContentsTheSame(NewsEntity oldItem, NewsEntity newItem) {
return oldItem.getViews() == newItem.getViews();
}
@Override
public int getItemViewType(int position) {
if (position == mEntityList.size()) {
return ItemViewType.LOADING;
}
NewsEntity newsEntity = mEntityList.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, mListListener);
case ItemViewType.NEWS_IMAGE2:
view = mLayoutInflater.inflate(R.layout.news_image2_item, parent, false);
return new NewsImage2ViewHolder(view, mListListener);
case ItemViewType.NEWS_IMAGE3:
view = mLayoutInflater.inflate(R.layout.news_image3_item, parent, false);
return new NewsImage3ViewHolder(view, 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);
addLongClickListenerIfNeed(holder, mEntityList.get(position));
break;
case ItemViewType.NEWS_IMAGE2:
initNewsImage2ViewHolder((NewsImage2ViewHolder) holder, position);
addLongClickListenerIfNeed(holder, mEntityList.get(position));
break;
case ItemViewType.NEWS_IMAGE3:
initNewsImage3ViewHolder((NewsImage3ViewHolder) holder, position);
addLongClickListenerIfNeed(holder, mEntityList.get(position));
break;
case ItemViewType.LOADING:
FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
footerViewHolder.initItemPadding();
footerViewHolder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint);
break;
}
}
private void addLongClickListenerIfNeed(RecyclerView.ViewHolder holder, NewsEntity newsEntity) {
if (ArticleFragment.HISTORY.equals(mViewModel.type)) {
holder.itemView.setOnLongClickListener(v -> {
DialogHelper.showDialog(holder.itemView.getContext(),
"删除记录",
"删除浏览记录将不可恢复,确定删除吗?",
"确定",
"取消",
() -> {
mViewModel.removeHistory(newsEntity);
},
() -> {
},
false, "", "");
return false;
});
}
}
@Override
public int getItemCount() {
return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT;
}
private void initNewsImage1ViewHolder(final NewsImage1ViewHolder viewHolder, int position) {
final NewsEntity newsEntity = mEntityList.get(position);
viewHolder.setClickData(newsEntity);
if (newsEntity.getThumbnail() != null && newsEntity.getThumbnail().getUrl() != null) {
ImageUtils.display(viewHolder.thumb, newsEntity.getThumbnail().getUrl().get(0));
} else {
ImageUtils.display(viewHolder.thumb, R.drawable.message_image_placeholder);
}
viewHolder.title.setText(newsEntity.getTitle());
if (newsEntity.getActive()) {
viewHolder.title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
} else {
viewHolder.title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
}
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(), "阅读 %s", NumberUtils.transSimpleCount(views)));
}
NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position);
}
private void initNewsImage2ViewHolder(final NewsImage2ViewHolder viewHolder, int position) {
final NewsEntity newsEntity = mEntityList.get(position);
viewHolder.setClickData(newsEntity);
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());
if (newsEntity.getActive()) {
viewHolder.title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
} else {
viewHolder.title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
}
ImageUtils.display(viewHolder.thumb1, newsEntity.getThumbnail().getUrl().get(0));
ImageUtils.display(viewHolder.thumb2, newsEntity.getThumbnail().getUrl().get(1));
ImageUtils.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(), "阅读 %s", NumberUtils.transSimpleCount(views)));
}
NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position);
}
private void initNewsImage3ViewHolder(final NewsImage3ViewHolder viewHolder, int position) {
final NewsEntity newsEntity = mEntityList.get(position);
viewHolder.setClickData(newsEntity);
viewHolder.title.setText(newsEntity.getTitle());
if (newsEntity.getActive()) {
viewHolder.title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
} else {
viewHolder.title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
viewHolder.title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
}
ImageUtils.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(), "阅读 %s", NumberUtils.transSimpleCount(views)));
}
NewsUtils.setNewsType(viewHolder.type, newsEntity.getType(), newsEntity.getPriority(), position);
}
// 统计新闻阅读量
public void statNewsViews(final NewsEntity newsEntity, final int position) {
RetrofitManager.getInstance(mContext).getApi().postArticleVisit(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();
}
}
}
});
}
}