395 lines
18 KiB
Java
395 lines
18 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.Gravity;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.WindowManager;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.PopupWindow;
|
|
|
|
import com.gh.gamecenter.common.callback.OnListClickListener;
|
|
import com.gh.gamecenter.common.constant.ItemViewType;
|
|
import com.gh.gamecenter.common.utils.DialogHelper;
|
|
import com.gh.gamecenter.common.utils.ExtensionsKt;
|
|
import com.gh.gamecenter.common.view.DrawableView;
|
|
import com.gh.gamecenter.core.utils.DisplayUtils;
|
|
import com.gh.gamecenter.common.utils.ImageUtils;
|
|
import com.gh.common.util.NewsUtils;
|
|
import com.gh.gamecenter.core.utils.NumberUtils;
|
|
import com.gh.gamecenter.R;
|
|
import com.gh.gamecenter.common.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.common.baselist.ListAdapter;
|
|
import com.gh.gamecenter.databinding.NewsImage1ItemBinding;
|
|
import com.gh.gamecenter.databinding.NewsImage2ItemBinding;
|
|
import com.gh.gamecenter.databinding.NewsImage3ItemBinding;
|
|
import com.gh.gamecenter.databinding.PopupHistoryOptionBinding;
|
|
import com.gh.gamecenter.entity.NewsEntity;
|
|
import com.gh.gamecenter.history.ManageOption;
|
|
import com.gh.gamecenter.manager.VisitManager;
|
|
import com.gh.gamecenter.common.retrofit.JSONObjectResponse;
|
|
import com.gh.gamecenter.retrofit.RetrofitManager;
|
|
|
|
import org.json.JSONException;
|
|
import org.json.JSONObject;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Locale;
|
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
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;
|
|
|
|
private ManageOption mCurrentOption = ManageOption.OPTION_MANAGER;
|
|
private PopupWindow mPopWindow;
|
|
private PopupHistoryOptionBinding mPopupBinding;
|
|
private ArrayList<String> selectItems = new ArrayList<>();
|
|
|
|
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;
|
|
}
|
|
|
|
public void changeOption(ManageOption option) {
|
|
mCurrentOption = option;
|
|
if (mCurrentOption == ManageOption.OPTION_MANAGER) {
|
|
if (mPopWindow != null) {
|
|
selectItems.clear();
|
|
mPopWindow.dismiss();
|
|
mPopWindow = null;
|
|
}
|
|
} else {
|
|
if (mPopWindow == null || mPopWindow.isShowing()) {
|
|
showOptionWindow();
|
|
}
|
|
}
|
|
|
|
notifyItemRangeChanged(0, mEntityList.size());
|
|
}
|
|
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
switch (viewType) {
|
|
case ItemViewType.NEWS_IMAGE1:
|
|
return new NewsImage1ViewHolder(NewsImage1ItemBinding.inflate(mLayoutInflater, parent, false), new OnListClickListener() {
|
|
@Override
|
|
public <T> void onListClick(View view, int position, T data) {
|
|
onClick(view, position, (NewsEntity) data);
|
|
}
|
|
});
|
|
case ItemViewType.NEWS_IMAGE2:
|
|
return new NewsImage2ViewHolder(NewsImage2ItemBinding.inflate(mLayoutInflater, parent, false), new OnListClickListener() {
|
|
@Override
|
|
public <T> void onListClick(View view, int position, T data) {
|
|
onClick(view, position, (NewsEntity) data);
|
|
}
|
|
});
|
|
case ItemViewType.NEWS_IMAGE3:
|
|
return new NewsImage3ViewHolder(NewsImage3ItemBinding.inflate(mLayoutInflater, parent, false), new OnListClickListener() {
|
|
@Override
|
|
public <T> void onListClick(View view, int position, T data) {
|
|
onClick(view, position, (NewsEntity) data);
|
|
}
|
|
});
|
|
case ItemViewType.LOADING:
|
|
return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false));
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void onClick(View view, int position, NewsEntity data) {
|
|
if (mCurrentOption == ManageOption.OPTION_MANAGER) {
|
|
mListListener.onListClick(view, position, data);
|
|
} else {
|
|
if (selectItems.contains(data.getId())) {
|
|
selectItems.remove(data.getId());
|
|
} else {
|
|
selectItems.add(data.getId());
|
|
}
|
|
checkSelectItems();
|
|
notifyItemChanged(position);
|
|
}
|
|
}
|
|
|
|
@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);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void addLongClickListenerIfNeed(RecyclerView.ViewHolder holder, NewsEntity newsEntity) {
|
|
if (ArticleFragment.HISTORY.equals(mViewModel.type)) {
|
|
holder.itemView.setOnLongClickListener(v -> {
|
|
DialogHelper.showCenterDialog(holder.itemView.getContext(),
|
|
"删除记录",
|
|
"删除浏览记录将不可恢复,确定删除吗?",
|
|
"确定",
|
|
"取消",
|
|
() -> {
|
|
mViewModel.removeHistory(newsEntity);
|
|
},
|
|
() -> {
|
|
});
|
|
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.binding.newsImage1Thumb, newsEntity.getThumbnail().getUrl().get(0));
|
|
} else {
|
|
ImageUtils.display(viewHolder.binding.newsImage1Thumb, R.drawable.message_image_placeholder);
|
|
}
|
|
viewHolder.binding.selectIv.setVisibility(mCurrentOption == ManageOption.OPTION_MANAGER ? View.GONE : View.VISIBLE);
|
|
viewHolder.binding.selectIv.setChecked(selectItems.contains(newsEntity.getId()));
|
|
|
|
viewHolder.binding.newsImage1Title.setText(newsEntity.getTitle());
|
|
if (newsEntity.getActive()) {
|
|
viewHolder.binding.newsImage1Title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
|
|
viewHolder.binding.newsImage1Title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
|
|
} else {
|
|
viewHolder.binding.newsImage1Title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
|
|
viewHolder.binding.newsImage1Title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
|
|
}
|
|
int views = newsEntity.getViews();
|
|
if (views == 0) {
|
|
viewHolder.binding.newsImage1Read.setVisibility(View.GONE);
|
|
} else {
|
|
viewHolder.binding.newsImage1Read.setVisibility(View.VISIBLE);
|
|
viewHolder.binding.newsImage1Read.setText(String.format(Locale.getDefault(), "阅读 %s", NumberUtils.transSimpleCount(views)));
|
|
}
|
|
NewsUtils.setNewsType(viewHolder.binding.newsImage1Type, 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.binding.newsImage2Thumb1.setLayoutParams(lparams1);
|
|
|
|
LinearLayout.LayoutParams lparams2 = new LinearLayout.LayoutParams(width, height);
|
|
lparams2.leftMargin = DisplayUtils.dip2px(mContext, 8);
|
|
viewHolder.binding.newsImage2Thumb2.setLayoutParams(lparams2);
|
|
|
|
LinearLayout.LayoutParams lparams3 = new LinearLayout.LayoutParams(width, height);
|
|
lparams3.leftMargin = DisplayUtils.dip2px(mContext, 8);
|
|
viewHolder.binding.newsImage2Thumb3.setLayoutParams(lparams3);
|
|
|
|
viewHolder.binding.selectIv.setVisibility(mCurrentOption == ManageOption.OPTION_MANAGER ? View.GONE : View.VISIBLE);
|
|
viewHolder.binding.selectIv.setChecked(selectItems.contains(newsEntity.getId()));
|
|
|
|
viewHolder.binding.newsImage2Title.setText(newsEntity.getTitle());
|
|
if (newsEntity.getActive()) {
|
|
viewHolder.binding.newsImage2Title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
|
|
viewHolder.binding.newsImage2Title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
|
|
} else {
|
|
viewHolder.binding.newsImage2Title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
|
|
viewHolder.binding.newsImage2Title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
|
|
}
|
|
ImageUtils.display(viewHolder.binding.newsImage2Thumb1, newsEntity.getThumbnail().getUrl().get(0));
|
|
ImageUtils.display(viewHolder.binding.newsImage2Thumb2, newsEntity.getThumbnail().getUrl().get(1));
|
|
ImageUtils.display(viewHolder.binding.newsImage2Thumb3, newsEntity.getThumbnail().getUrl().get(2));
|
|
int views = newsEntity.getViews();
|
|
if (views == 0) {
|
|
viewHolder.binding.newsImage2Read.setVisibility(View.GONE);
|
|
} else {
|
|
viewHolder.binding.newsImage2Read.setVisibility(View.VISIBLE);
|
|
viewHolder.binding.newsImage2Read.setText(String.format(Locale.getDefault(), "阅读 %s", NumberUtils.transSimpleCount(views)));
|
|
}
|
|
NewsUtils.setNewsType(viewHolder.binding.newsImage2Type, newsEntity.getType(), newsEntity.getPriority(), position);
|
|
}
|
|
|
|
private void initNewsImage3ViewHolder(final NewsImage3ViewHolder viewHolder, int position) {
|
|
|
|
final NewsEntity newsEntity = mEntityList.get(position);
|
|
viewHolder.setClickData(newsEntity);
|
|
viewHolder.binding.newsImage3Title.setText(newsEntity.getTitle());
|
|
if (newsEntity.getActive()) {
|
|
viewHolder.binding.newsImage3Title.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
|
|
viewHolder.binding.newsImage3Title.setTextColor(ContextCompat.getColor(mContext, R.color.title));
|
|
} else {
|
|
viewHolder.binding.newsImage3Title.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
|
|
viewHolder.binding.newsImage3Title.setTextColor(ContextCompat.getColor(mContext, R.color.hint));
|
|
}
|
|
viewHolder.binding.selectIv.setVisibility(mCurrentOption == ManageOption.OPTION_MANAGER ? View.GONE : View.VISIBLE);
|
|
viewHolder.binding.selectIv.setChecked(selectItems.contains(newsEntity.getId()));
|
|
|
|
ImageUtils.display(viewHolder.binding.newsImage3Thumb, newsEntity.getThumbnail().getUrl().get(0),
|
|
mContext.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(mContext, 40));
|
|
int views = newsEntity.getViews();
|
|
if (views == 0) {
|
|
viewHolder.binding.newsImage3Read.setVisibility(View.GONE);
|
|
} else {
|
|
viewHolder.binding.newsImage3Read.setVisibility(View.VISIBLE);
|
|
viewHolder.binding.newsImage3Read.setText(String.format(Locale.getDefault(), "阅读 %s", NumberUtils.transSimpleCount(views)));
|
|
}
|
|
NewsUtils.setNewsType(viewHolder.binding.newsImage3Type, newsEntity.getType(), newsEntity.getPriority(), position);
|
|
}
|
|
|
|
// 统计新闻阅读量
|
|
public void statNewsViews(final NewsEntity newsEntity, final int position) {
|
|
RetrofitManager.getInstance().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();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void showOptionWindow() {
|
|
mPopupBinding = PopupHistoryOptionBinding.inflate(LayoutInflater.from(mContext));
|
|
mPopupBinding.getRoot().setFocusable(true);
|
|
mPopupBinding.getRoot().setFocusableInTouchMode(true);
|
|
|
|
mPopWindow = new PopupWindow(mPopupBinding.getRoot(), LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(56f));
|
|
mPopWindow.showAtLocation(((AppCompatActivity) mContext).getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
|
|
mPopupBinding.itemDelete.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
DialogHelper.showDialog(mContext,
|
|
"是否删除" + selectItems.size() + "条记录?",
|
|
"提示:删除记录将不可恢复",
|
|
"删除",
|
|
"取消",
|
|
() -> {
|
|
mViewModel.removeHistories(selectItems);
|
|
selectItems.clear();
|
|
checkSelectItems();
|
|
},
|
|
() -> {
|
|
},
|
|
false, "", "");
|
|
|
|
|
|
}
|
|
});
|
|
mPopupBinding.checkAllCb.setCompoundDrawablesWithIntrinsicBounds(
|
|
DrawableView.getCheckSelectorDrawable(
|
|
mContext
|
|
), null, null, null
|
|
);
|
|
mPopupBinding.checkAllCb.setOnClickListener(v -> {
|
|
if (mPopupBinding.checkAllCb.isChecked()) {
|
|
selectItems.clear();
|
|
for (NewsEntity entity : mEntityList) {
|
|
selectItems.add(entity.getId());
|
|
}
|
|
} else {
|
|
selectItems.clear();
|
|
}
|
|
checkSelectItems();
|
|
notifyItemRangeChanged(0, mEntityList.size());
|
|
});
|
|
checkSelectItems();
|
|
}
|
|
|
|
private void checkSelectItems() {
|
|
if (mPopupBinding == null) return;
|
|
mPopupBinding.selectNumTv.setText(selectItems.isEmpty() ? "" : "(" + selectItems.size() + ")");
|
|
mPopupBinding.itemDelete.setBackground(selectItems.isEmpty() ? ExtensionsKt.toDrawable(R.drawable.bg_shape_f5_radius_999) : ExtensionsKt.toDrawable(R.drawable.download_button_normal_style));
|
|
mPopupBinding.itemDelete.setTextColor(selectItems.isEmpty() ? ExtensionsKt.toColor(R.color.text_body) : ExtensionsKt.toColor(R.color.white));
|
|
mPopupBinding.itemDelete.setEnabled(!selectItems.isEmpty());
|
|
mPopupBinding.checkAllCb.setChecked(selectItems.size() == mEntityList.size());
|
|
}
|
|
|
|
}
|