From e364b7d3b0637ecd4a8e73e09b144dd67d812d01 Mon Sep 17 00:00:00 2001 From: "kehaoyuan@ghzhushou.com" Date: Wed, 26 Feb 2020 16:08:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=88=91=E7=9A=84=E6=94=B6?= =?UTF-8?q?=E8=97=8F-=E7=A4=BE=E5=8C=BA=E6=96=87=E7=AB=A0/=E5=9B=9E?= =?UTF-8?q?=E7=AD=94UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/collection/AnswerAdapter.java | 74 ++++++++++++++++++- .../gamecenter/collection/AnswerFragment.java | 58 ++------------- .../collection/CommunityArticleAdapter.kt | 66 +++-------------- .../answer/CommunityAnswerItemViewHolder.kt | 33 ++++++++- .../gh/gamecenter/qa/entity/ArticleEntity.kt | 3 + .../main/res/layout/community_answer_item.xml | 10 +++ 6 files changed, 129 insertions(+), 115 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java index bdb9f9d115..01fdfafac1 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java @@ -9,11 +9,20 @@ import android.view.ViewGroup; import com.gh.base.OnListClickListener; import com.gh.common.constant.ItemViewType; +import com.gh.common.util.CollectionUtils; +import com.gh.common.util.DialogUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.baselist.LoadType; +import com.gh.gamecenter.databinding.CommunityAnswerItemBinding; +import com.gh.gamecenter.qa.answer.CommunityAnswerItemViewHolder; +import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; import com.gh.gamecenter.qa.entity.AnswerEntity; +import com.gh.gamecenter.qa.entity.Questions; import com.gh.gamecenter.qa.questions.detail.AnswerViewHolder; import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; +import com.lightgame.utils.Utils; /** * Created by khy on 22/12/17. @@ -23,11 +32,14 @@ public class AnswerAdapter extends ListAdapter { private OnListClickListener mListClickListener; + private AnswerViewModel mListViewModel; + private String mEntrance; private AnswerFragment.Type mType; - public AnswerAdapter(Context context, AnswerFragment.Type type, OnListClickListener listClickListener, String entrance) { + public AnswerAdapter(Context context, AnswerViewModel viewModel, AnswerFragment.Type type, OnListClickListener listClickListener, String entrance) { super(context); + mListViewModel = viewModel; mListClickListener = listClickListener; mEntrance = entrance; this.mType = type; @@ -47,8 +59,8 @@ public class AnswerAdapter extends ListAdapter { view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); return new FooterViewHolder(view, mListClickListener); case ItemViewType.ITEM_BODY: - view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mListClickListener); + view = mLayoutInflater.inflate(R.layout.community_answer_item, parent, false); + return new CommunityAnswerItemViewHolder(CommunityAnswerItemBinding.bind(view)); default: return null; } @@ -58,7 +70,41 @@ public class AnswerAdapter extends ListAdapter { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case ItemViewType.ITEM_BODY: - ((AnswerViewHolder) holder).initCollectionAnswerViewHolder(mContext, mEntityList.get(position), mEntrance, mType); + CommunityAnswerItemViewHolder viewHolder = (CommunityAnswerItemViewHolder) holder; + AnswerEntity entity = mEntityList.get(position); + String path; + if (mType == AnswerFragment.Type.COLLECTION) { + path = "我的收藏-回答列表"; + } else if (mType == AnswerFragment.Type.HISTORY) { + path = "浏览记录-回答列表"; + } else { + path = "插入回答-收藏回答列表"; + } + viewHolder.bindAnswerItem(entity, mEntrance, path); + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (entity.getActive()) { + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), mEntrance, path)); + } else { + showDeleteDialog(entity.getId()); + } + + if (!entity.getRead()) { + entity.setRead(true); + notifyItemChanged(position); + mListViewModel.postCollectionAnswerRead(entity.getId()); + } + } + }); + viewHolder.getBinding().title.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Questions questions = entity.getQuestions(); + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); + } + }); break; case ItemViewType.ITEM_FOOTER: FooterViewHolder footerViewHolder = (FooterViewHolder) holder; @@ -68,6 +114,26 @@ public class AnswerAdapter extends ListAdapter { } } + private void showDeleteDialog(String answerId) { + DialogUtils.showCancelAlertDialog(mContext, "提示" + , "内容已被删除,是否取消收藏?" + , "取消收藏", "暂不" + , () -> CollectionUtils.INSTANCE.deleteCollection(mContext, answerId + , CollectionUtils.CollectionType.answer, new CollectionUtils.OnCollectionListener() { + @Override + public void onSuccess() { + Utils.toast(mContext, R.string.collection_cancel); + mListViewModel.load(LoadType.REFRESH); + } + + @Override + public void onError() { + Utils.toast(mContext, R.string.collection_cancel_failure); + } + }), null); + } + + @Override public int getItemCount() { return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; diff --git a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java index 6438e2564b..3bf58c60f4 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java @@ -4,18 +4,13 @@ import android.view.View; import com.gh.common.history.HistoryDatabase; import com.gh.common.util.CollectionUtils; -import com.gh.common.util.DialogUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadType; -import com.gh.gamecenter.baselist.NormalListViewModel; import com.gh.gamecenter.eventbus.EBCollectionChanged; import com.gh.gamecenter.manager.UserManager; -import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; import com.gh.gamecenter.qa.entity.AnswerEntity; -import com.gh.gamecenter.qa.entity.Questions; -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; import com.gh.gamecenter.retrofit.RetrofitManager; import org.greenrobot.eventbus.Subscribe; @@ -43,7 +38,7 @@ public class AnswerFragment extends ListFragment @Override protected ListAdapter provideListAdapter() { - return mAdapter == null ? mAdapter = new AnswerAdapter(getContext(), mType,this, mEntrance) : mAdapter; + return mAdapter == null ? mAdapter = new AnswerAdapter(getContext(), mListViewModel, mType, this, mEntrance) : mAdapter; } @Override @@ -64,56 +59,13 @@ public class AnswerFragment extends ListFragment @Override public void onListClick(View view, int position, Object data) { - AnswerEntity entity; - switch (view.getId()) { - case R.id.footerview_item: - if (mAdapter.isNetworkError()) { - mListViewModel.load(LoadType.RETRY); - } - break; - case R.id.ask_answer_item_constraintlayout: - case R.id.ask_answer_item_content: - entity = (AnswerEntity) data; - if (entity.getActive()) { - startActivity(AnswerDetailActivity.getIntent(getContext(), entity.getId(), mEntrance, "我的收藏-回答")); - } else { - showDeleteDialog(entity.getId()); - } - - if (!entity.getRead()) { - entity.setRead(true); - mAdapter.notifyItemChanged(position); - mListViewModel.postCollectionAnswerRead(entity.getId()); - } - break; - case R.id.ask_answer_item_title: - entity = (AnswerEntity) data; - Questions questions = entity.getQuestions(); - startActivity(QuestionsDetailActivity.getIntent(getContext(), questions.getId(), mEntrance, "我的收藏-回答")); - break; + if (view.getId() == R.id.footerview_item) { + if (mAdapter.isNetworkError()) { + mListViewModel.load(LoadType.RETRY); + } } } - - private void showDeleteDialog(String answerId) { - DialogUtils.showCancelAlertDialog(getContext(), "提示" - , "内容已被删除,是否取消收藏?" - , "取消收藏", "暂不" - , () -> CollectionUtils.INSTANCE.deleteCollection(getContext(), answerId - , CollectionUtils.CollectionType.answer, new CollectionUtils.OnCollectionListener() { - @Override - public void onSuccess() { - toast(R.string.collection_cancel); - mListViewModel.load(LoadType.REFRESH); - } - - @Override - public void onError() { - toast(R.string.collection_cancel_failure); - } - }), null); - } - // 收藏事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBCollectionChanged changed) { diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt index fc16f82e78..30b2b6c146 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt @@ -1,18 +1,16 @@ package com.gh.gamecenter.collection import android.content.Context -import android.graphics.Paint import android.view.View import android.view.ViewGroup -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import anet.channel.util.Utils.context +import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter -import com.gh.gamecenter.databinding.CollectionComunityArticleItemBinding +import com.gh.gamecenter.databinding.CommunityAnswerItemBinding +import com.gh.gamecenter.qa.answer.CommunityAnswerItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.ArticleEntity @@ -30,7 +28,7 @@ class CommunityArticleAdapter(context: Context, return ItemViewType.ITEM_BODY } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view: View return when (viewType) { ItemViewType.ITEM_FOOTER -> { @@ -38,8 +36,8 @@ class CommunityArticleAdapter(context: Context, FooterViewHolder(view) } else -> { - view = mLayoutInflater.inflate(R.layout.collection_comunity_article_item, parent, false) - CollectionCommunityArticleViewHolder(CollectionComunityArticleItemBinding.bind(view)) + view = mLayoutInflater.inflate(R.layout.community_answer_item, parent, false) + CommunityAnswerItemViewHolder(CommunityAnswerItemBinding.bind(view)) } } } @@ -47,35 +45,12 @@ class CommunityArticleAdapter(context: Context, override fun getItemCount(): Int = if (mEntityList.size == 0) 0 else mEntityList.size + 1 - override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { - if (holder is CollectionCommunityArticleViewHolder) { - val path = "我的收藏-文章" + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is CommunityAnswerItemViewHolder) { + val path = if (mType == CommunityArticleFragment.Type.COLLECTION) "我的收藏-文章列表" else "浏览记录-文章列表" val entity = mEntityList[position] - holder.binding.data = entity + holder.bindArticleItem(entity, mEntrance, path) - if (entity.active) { - holder.binding.content.paint.flags = Paint.ANTI_ALIAS_FLAG - holder.binding.content.setTextColor(ContextCompat.getColor(mContext, R.color.title)) - } else { - holder.binding.content.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG - holder.binding.content.setTextColor(ContextCompat.getColor(mContext, R.color.hint)) - } - if (entity.user.badge != null) { - holder.binding.sdvUserBadge.visibility = View.VISIBLE - holder.binding.tvBadgeName.visibility = View.VISIBLE - ImageUtils.display(holder.binding.sdvUserBadge, entity.user.badge!!.icon) - holder.binding.tvBadgeName.text = entity.user.badge!!.name - } else { - holder.binding.sdvUserBadge.visibility = View.GONE - holder.binding.tvBadgeName.visibility = View.GONE - } - val key = if (mType == CommunityArticleFragment.Type.COLLECTION) "我的收藏-文章列表" else "浏览记录-文章列表" - holder.binding.sdvUserBadge.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录", key, entity.user.name + "(" + entity.user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(mContext, entity.user.id, entity.user.name, entity.user.icon) - } - holder.binding.tvBadgeName.setOnClickListener { v -> holder.binding.sdvUserBadge.performClick() } holder.itemView.setOnClickListener { if (entity.active) { mContext.startActivity(ArticleDetailActivity.getIntent(mContext, entity.community, entity.id, mEntrance, path)) @@ -91,27 +66,6 @@ class CommunityArticleAdapter(context: Context, mViewModel.postCollectionArticleRead(entity.community.id, entity.id) } } - holder.binding.userIconContainer.setOnClickListener { - DirectUtils.directToHomeActivity(mContext, entity.user.id, mEntrance, path) - } - - holder.binding.userName.setOnClickListener { - DirectUtils.directToHomeActivity(mContext, entity.user.id, mEntrance, path) - } - if (!entity.read) { - holder.binding.title.post { - val lineCount = holder.binding.title.lineCount - if (lineCount > 0) { - val lineWidth = holder.binding.title.layout.getLineWidth(lineCount - 1) - val layoutParams = holder.binding.unreadHint.layoutParams as ConstraintLayout.LayoutParams - layoutParams.setMargins(lineWidth.toInt(), 0, 0, DisplayUtils.dip2px(18f)) - holder.binding.unreadHint.layoutParams = layoutParams - holder.binding.unreadHint.visibility = View.VISIBLE - } - } - } else { - holder.binding.unreadHint.visibility = View.GONE - } } else if (holder is FooterViewHolder) { holder.initItemPadding() holder.initFooterViewHolder(mViewModel, mIsLoading, isNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt index b95caebdc4..9abea1a7a9 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt @@ -1,7 +1,10 @@ package com.gh.gamecenter.qa.answer +import android.graphics.Paint import android.graphics.Typeface import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat import com.gh.base.BaseRecyclerViewHolder import com.gh.common.util.* import com.gh.gamecenter.R @@ -13,14 +16,13 @@ import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager -import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import retrofit2.HttpException /** - * 因为社区回答和社区文章的样式完全一样,所以就统一处理吧! + * 因为社区回答和社区文章的样式完全一样,所以就统一处理吧!有需要时可以直接复制一份作为单独的社区文章样式 */ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -100,6 +102,8 @@ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : B key = "问答-推荐" } else if (path == "问题详情" || path == "折叠答案") { key = path + } else { + key = path // 默认就使用path字段吧,总比为空的好 } MtaHelper.onEvent("进入徽章墙_用户记录", key, user.name + "(" + user.id + ")") MtaHelper.onEvent("徽章中心", "进入徽章中心", key) @@ -110,6 +114,31 @@ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.userIcon.setOnClickListener(userClick) binding.userName.setOnClickListener(userClick) + // 内容修改时,再标题加上红点,一般用于收藏 + if (!entity.read) { + binding.title.post { + val lineCount = binding.title.lineCount + if (lineCount > 0) { + val lineWidth = binding.title.layout.getLineWidth(lineCount - 1) + val layoutParams = binding.unreadHint.layoutParams as ConstraintLayout.LayoutParams + layoutParams.setMargins(lineWidth.toInt(), 0, 0, DisplayUtils.dip2px(18f)) + binding.unreadHint.layoutParams = layoutParams + binding.unreadHint.visibility = View.VISIBLE + } + } + } else { + binding.unreadHint.visibility = View.GONE + } + + // 如果当前回答/文章被删除则内容加上删除线,一般用于收藏 + if (entity.active) { + binding.content.paint.flags = Paint.ANTI_ALIAS_FLAG + binding.content.setTextColor(ContextCompat.getColor(itemView.context, R.color.text_666666)) + } else { + binding.content.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG + binding.content.setTextColor(ContextCompat.getColor(itemView.context, R.color.hint)) + } + binding.executePendingBindings() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index e83a62fc97..6aff3d6a3e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -51,7 +51,10 @@ data class ArticleEntity( answer.user = user answer.time = time?.create answer.vote = count.vote + answer.active = active answer.commentCount = count.comment + answer.orderTag = orderTag + answer.read = read return answer } } diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index 3bb3e7693e..65bd0461cb 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -46,6 +46,16 @@ app:layout_constraintTop_toBottomOf="@id/top_line" tools:text="本名李嘉恆,加拿大籍華人,出生於廣東省廣州,2012年在韓國出道,曾為韓國男子組合EXO成員及中國分隊EXO-M隊長。" /> + +