package com.ihewro.focus.adapter; import android.app.Activity; import android.content.Context; import android.support.annotation.Nullable; import android.support.v7.recyclerview.extensions.AsyncListDiffer; import android.support.v7.util.DiffUtil; import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import com.blankj.ALog; import com.chad.library.adapter.base.BaseItemDraggableAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.getkeepsafe.taptargetview.TapTarget; import com.getkeepsafe.taptargetview.TapTargetView; import com.ihewro.focus.R; import com.ihewro.focus.activity.PostDetailActivity; import com.ihewro.focus.bean.EventMessage; import com.ihewro.focus.bean.FeedItem; import com.ihewro.focus.bean.UserPreference; import com.ihewro.focus.callback.UICallback; import com.ihewro.focus.decoration.SuspensionDecoration; import com.ihewro.focus.helper.ItemTouchHelperAdapter; import com.ihewro.focus.helper.ItemTouchHelperViewHolder; import com.ihewro.focus.helper.MyViewHolder; import com.ihewro.focus.helper.SimpleItemTouchHelperCallback; import com.ihewro.focus.util.DataUtil; import com.ihewro.focus.util.DateUtil; import com.ihewro.focus.util.ImageLoaderManager; import com.ihewro.focus.util.RSSUtil; import com.ihewro.focus.util.StringUtil; import com.lxj.xpopup.XPopup; import com.lxj.xpopup.interfaces.OnSelectListener; import com.nostra13.universalimageloader.core.ImageLoader; import org.greenrobot.eventbus.EventBus; import org.litepal.crud.callback.SaveCallback; import java.util.ArrayList; import java.util.List; import es.dmoral.toasty.Toasty; import skin.support.utils.SkinPreference; /** * <pre> * author : hewro * e-mail : [email protected] * time : 2019/03/13 * desc : * version: 1.0 * </pre> */ public class UserFeedPostsVerticalAdapter extends BaseItemDraggableAdapter<FeedItem, MyViewHolder> implements ItemTouchHelperAdapter { private Activity activity; private String feedName; private List<FeedItem> feedItemList; private boolean isRequesting = false; private AsyncListDiffer<FeedItem> mDiffer; private DiffUtil.ItemCallback<FeedItem> diffCallback = new DiffUtil.ItemCallback<FeedItem>() { @Override public boolean areItemsTheSame(FeedItem oldItem, FeedItem newItem) { return TextUtils.equals(oldItem.getId()+"", newItem.getId()+""); } @Override public boolean areContentsTheSame(FeedItem oldItem, FeedItem newItem) { return oldItem.getTitle().equals(newItem.getTitle()); } }; private int not_read_color; private int read_color; private int not_read_content_color; private int read_content_color; private SimpleItemTouchHelperCallback simpleItemTouchHelperCallback; private SuspensionDecoration suspensionDecoration; public UserFeedPostsVerticalAdapter(@Nullable List<FeedItem> data, Activity activity, SuspensionDecoration suspensionDecoration, SimpleItemTouchHelperCallback simpleItemTouchHelperCallback) { super(R.layout.item_post, data); this.activity = activity; this.feedItemList = data; this.suspensionDecoration = suspensionDecoration; this.simpleItemTouchHelperCallback = simpleItemTouchHelperCallback; //初始化 mDiffer = new AsyncListDiffer<>(this, diffCallback); //初始化颜色参数 if(SkinPreference.getInstance().getSkinName().equals("night")){ read_color = R.color.text_read_night; read_content_color = R.color.text_read_content_night; not_read_color = R.color.text_unread_night; not_read_content_color = R.color.text_unread_content_night; }else { read_color = R.color.text_read; read_content_color = R.color.text_read_content; not_read_color = R.color.text_unread; not_read_content_color = R.color.text_unread_content; } } public void setNewDataByDiff(@Nullable List<FeedItem> data,int notReadNum) { // ALog.d("设置新的数据" + data.size()); if (notReadNum==0){ this.setNewData(data); }else { updateDecoration(data); mDiffer.submitList(data); } } @Override public void setNewData(@Nullable List<FeedItem> data) { updateDecoration(data); super.setNewData(data); } private void updateDecoration(List<FeedItem> data){ if (data==null){ data = new ArrayList<>(); } if (simpleItemTouchHelperCallback != null){ simpleItemTouchHelperCallback.setmDatas(data); } if (suspensionDecoration != null){ suspensionDecoration.setmDatas(data); } } @Override protected void convert(final MyViewHolder helper, FeedItem item) { //绑定事件 bindListener(helper,item); if (helper.getAdapterPosition() == 0){ // ALog.d("第一个项目" + item.getTitle()); } // ALog.d(item.getTitle() + "日期:" + item.getDate()); helper.setText(R.id.post_title,item.getTitle()); helper.setText(R.id.rss_name,item.getFeedName()); helper.setText(R.id.post_summay, DataUtil.getOptimizedDesc(item.getSummary())); helper.setText(R.id.post_time, DateUtil.getTTimeStringByInt(item.getDate())); if (UserPreference.queryValueByKey(UserPreference.not_show_image_in_list,"0").equals("0")){ String imageUrl = DataUtil.getFeedItemImageUrl(item); if (!StringUtil.trim(imageUrl).equals("")){ imageUrl = RSSUtil.handleImageUrl(imageUrl,item.getUrl(),item.isBadGuy(),item.isChina()); helper.getView(R.id.post_pic).setVisibility(View.VISIBLE); ImageLoader.getInstance().displayImage(StringUtil.trim(imageUrl), (ImageView) helper.getView(R.id.post_pic),ImageLoaderManager.getSubsciptionIconOptions(activity)); }else { helper.getView(R.id.post_pic).setVisibility(View.GONE); } }else {//无图列表 helper.getView(R.id.post_pic).setVisibility(View.GONE); } updateUI(helper,item); } private void updateUI(final BaseViewHolder helper,FeedItem item){ if (item.isRead()){ // ALog.d("是否已读" + item.isRead()); helper.setTextColor(R.id.post_title,activity.getResources().getColor(read_color)); helper.setTextColor(R.id.rss_name,activity.getResources().getColor(read_content_color)); helper.setTextColor(R.id.post_summay,activity.getResources().getColor(read_content_color)); helper.setTextColor(R.id.post_time,activity.getResources().getColor(read_content_color)); // helper.setText(R.id.markRead,"标记未读"); }else { helper.setTextColor(R.id.post_title,activity.getResources().getColor(not_read_color)); helper.setTextColor(R.id.rss_name,activity.getResources().getColor(not_read_content_color)); helper.setTextColor(R.id.post_summay,activity.getResources().getColor(not_read_content_color)); helper.setTextColor(R.id.post_time,activity.getResources().getColor(not_read_content_color)); // helper.setText(R.id.markRead,"标记已读"); } if (item.isFavorite()){ helper.getView(R.id.favorite).setVisibility(View.VISIBLE); // helper.setText(R.id.star,"取消收藏"); }else { helper.getView(R.id.favorite).setVisibility(View.GONE); // helper.setText(R.id.star,"收藏"); } } private void bindListener(final BaseViewHolder helper, final FeedItem item){ /* // ((EasySwipeMenuLayout)helper.getView(R.id.swipe)); helper.getView(R.id.markRead).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { item.setRead(!item.isRead()); //保存到数据库 FeedItem temp = LitePal.find(FeedItem.class,item.getId()); temp.setRead(item.isRead()); temp.save(); //通知 if (item.isRead()){ Toasty.success(activity,"标记已读成功").show(); }else { Toasty.success(activity,"标记未读成功").show(); } notifyItemChanged(helper.getAdapterPosition()); EventBus.getDefault().post(new EventMessage(EventMessage.EDIT_ITEM_READ)); } });*/ helper.getView(R.id.content_container).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { FeedItem.clickWhenNotFavorite(activity, item, new UICallback() { @Override public void doUIWithFlag(final boolean flag) { //保存到数据库 item.setFavorite(flag); item.saveAsync().listen(new SaveCallback() { @Override public void onFinish(boolean success) { //通知 if (flag){ Toasty.success(activity,"收藏成功").show(); }else { Toasty.success(activity,"取消收藏成功").show(); } notifyItemChanged(helper.getAdapterPosition()); } }); } }); return true; } }); //跳转页面 helper.getView(R.id.content_container).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (UserPreference.queryValueByKey(UserPreference.FIRST_INTRO_MAIN_FEED_ITEM, "0").equals("0")){ initTapView(helper.getView(R.id.operations)); }else { ArrayList<Integer> list = new ArrayList<>(); for (FeedItem feedItem: feedItemList){ list.add(feedItem.getId()); } //如果当前正在请求数据,则来源变成ORIGIN_SEARCH,否则使用ORIGIN_MAIN,用于更新首页已读样式不同 if (isRequesting){ PostDetailActivity.activityStart(activity,helper.getAdapterPosition(),feedItemList,PostDetailActivity.ORIGIN_SEARCH); }else { PostDetailActivity.activityStart(activity,helper.getAdapterPosition(),feedItemList,PostDetailActivity.ORIGIN_MAIN); } } } }); helper.getView(R.id.operations).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String[] list = new String[]{"将以上部分标记为已读","将当前文章标记已(未)读", "将以下部分标记为已读"}; if (item.isRead()){ list[1] = "将当前文章标记未读"; }else { list[1] = "将当前文章标记已读"; } new XPopup.Builder(activity) .atView(helper.getView(R.id.operations)) // 依附于所点击的View,内部会自动判断在上方或者下方显示 .hasShadowBg(false) .asAttachList(list, new int[]{}, new OnSelectListener() { @Override public void onSelect(int position, String text) { if (position == 0){ markReadOfTop(helper,item); }else if (position == 2){ markReadOfBottom(helper,item); }else if (position == 1){ //当前项目标记已读/未读 item.setRead(!item.isRead()); item.saveAsync().listen(new SaveCallback() { @Override public void onFinish(boolean success) { notifyItemChanged(helper.getAdapterPosition()); //修改首页未读数目相关界面 EventBus.getDefault().post(new EventMessage(EventMessage.MAIN_READ_NUM_EDIT)); } }); } } }) .show(); } }); } private void markReadOfTop(final BaseViewHolder helper, final FeedItem item){ for (int i = 0;i<helper.getAdapterPosition();i++){ feedItemList.get(i).setRead(true); feedItemList.get(i).save(); notifyItemChanged(i); } } private void markReadOfBottom(final BaseViewHolder helper, final FeedItem item){ for (int i = helper.getAdapterPosition();i<feedItemList.size();i++){ feedItemList.get(i).setRead(true); feedItemList.get(i).save(); notifyItemChanged(i); } } private void initTapView(View view){ TapTargetView.showFor(activity, // `this` is an Activity TapTarget.forView(view, "触发新手教程!", "先别急的进入!点击该图标也可以快速标记已读哦,文章左滑也可以快速标记收藏和已读哦!\n") .cancelable(false) .drawShadow(true) .titleTextColor(R.color.colorAccent) .descriptionTextColor(R.color.text_secondary_dark) .tintTarget(true) .targetCircleColor(android.R.color.black), new TapTargetView.Listener() { // The listener can listen for regular clicks, long clicks or cancels @Override public void onTargetClick(TapTargetView view) { super.onTargetClick(view); // This call is optional UserPreference.updateOrSaveValueByKey(UserPreference.FIRST_INTRO_MAIN_FEED_ITEM,"1"); } }); } public void setRequesting(boolean requesting) { isRequesting = requesting; } @Override public void onItemMove(int fromPosition, int toPosition) { ALog.d("fromPosition" + fromPosition + "toPosition" + toPosition); } @Override public void onItemDismiss(final int position) { ALog.d("滑动完毕!!"); //标记已读未读 FeedItem item = feedItemList.get(position); ALog.d(item.getTitle()); item.setRead(!item.isRead()); item.saveAsync().listen(new SaveCallback() { @Override public void onFinish(boolean success) { notifyItemChanged(position); EventBus.getDefault().post(new EventMessage(EventMessage.MAIN_READ_NUM_EDIT)); } }); } public void setDecoration(SuspensionDecoration suspensionDecoration, SimpleItemTouchHelperCallback simpleItemTouchHelperCallback){ this.suspensionDecoration = suspensionDecoration; this.simpleItemTouchHelperCallback = simpleItemTouchHelperCallback; } }