From 6f0738cebb267d63d8d85740d62aae17455c8106 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Wed, 28 Mar 2018 17:22:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E9=97=AE=E9=97=AE=E9=A2=98/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=97=AE=E9=A2=98=EF=BC=88=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/EntranceUtils.java | 1 + .../com/gh/gamecenter/CropImageActivity.java | 2 +- .../com/gh/gamecenter/SuggestionActivity.java | 2 +- .../gamecenter/ask/QuestionsEditFragment.java | 164 +++++++++++++----- .../ask/QuestionsEditIndexAdapter.java | 47 +---- .../ask/QuestionsEditIndexFragment.java | 55 +++++- .../ask/QuestionsEditIndexViewHolder.java | 4 +- .../gh/gamecenter/ask/entity/InviteEntity.kt | 5 +- .../com/gh/gamecenter/ask/entity/MeEntity.kt | 10 +- .../ask/entity/QuestionsIndexEntity.java | 42 +++++ .../questionsdetail/AnswerEditFragment.java | 2 +- .../QuestionsDetailAdapter.java | 27 +-- .../QuestionsDetailFragment.java | 13 +- .../invite/QuestionsInviteAdapter.java | 4 +- .../invite/QuestionsInviteFragment.java | 22 ++- .../invite/QuestionsInviteViewHolder.java | 18 +- .../ask/search/AskSearchFragment.java | 4 +- .../kaifu/KaiFuWrapperFragment.java | 23 ++- .../retrofit/service/ApiService.java | 34 +++- .../main/res/layout/questionsdetail_item.xml | 10 +- gradle.properties | 22 +-- 21 files changed, 347 insertions(+), 164 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsIndexEntity.java diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index 202363c0c5..f41751527b 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -67,6 +67,7 @@ public class EntranceUtils { public static final String KEY_QUESTIONS_PATCH = "questionsPatch"; public static final String KEY_INVITE_SEARCH_KEY = "inviteSearchKey"; public static final String KEY_MESSAGE_TYPE = "messageType"; + public static final String KEY_QUESTIONS_SEARCH_KEY = "questionsSearchKey"; public static void jumpActivity(Context context, Bundle bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/CropImageActivity.java b/app/src/main/java/com/gh/gamecenter/CropImageActivity.java index 675b69c4c6..668c91fc92 100644 --- a/app/src/main/java/com/gh/gamecenter/CropImageActivity.java +++ b/app/src/main/java/com/gh/gamecenter/CropImageActivity.java @@ -188,7 +188,7 @@ public class CropImageActivity extends BaseActivity { sp.edit().putString("updateIconCount", jsonObject.toString()).apply(); Intent data = new Intent(); - data.putExtra(EntranceUtils.KEY_URL, result.getString("icon")); + data.putExtra(EntranceUtils.KEY_URL, result.getString("url")); setResult(RESULT_OK, data); finish(); diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index f9097beca7..0d8804447a 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -500,7 +500,7 @@ public class SuggestionActivity extends BaseActivity implements SuggestTypeAdapt try { int statusCode = result.getInt("statusCode"); if (statusCode == HttpURLConnection.HTTP_OK) { - picArray.put(result.getString("icon")); + picArray.put(result.getString("url")); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java index 0aad95cc1f..a3e6b92e2d 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java @@ -1,5 +1,6 @@ package com.gh.gamecenter.ask; +import android.app.Activity; import android.app.Dialog; import android.content.Intent; import android.database.Cursor; @@ -63,6 +64,7 @@ import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.HttpException; +import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; @@ -88,13 +90,17 @@ public class QuestionsEditFragment extends NormalFragment { private static final int QUESTION_TITLE_MAX_LENGTH = 50; private static final int QUESTION_TAG_MAX_COUNT = 5; + private List mTagList = new ArrayList<>(); // 已选择的标签 + private List mAllTagList = new ArrayList<>(); // 全部标签(网络标签/新增标签) + private List mTagByTitle = new ArrayList<>(); // 根据标题匹配的变迁 + private QuestionsEditPicAdapter mAdapter; private WaitingDialogFragment mPostDialog; - private List mNetWordTagList = new ArrayList<>(); - private List mTagList = new ArrayList<>(); - private List mAllTagList = new ArrayList<>(); + private Dialog mTagDialog; + + private QuestionsDetailEntity mQuestionsEntity; private String mSearchKey; private Boolean mAgreePostPic; @@ -155,7 +161,7 @@ public class QuestionsEditFragment extends NormalFragment { toast("标题至少6个字"); return; } - CheckLoginUtils.checkLogin(getContext(), this::showTagDialog); + CheckLoginUtils.checkLogin(getContext(), this::addTagByTitle); } } @@ -171,6 +177,7 @@ public class QuestionsEditFragment extends NormalFragment { Bundle arguments = getArguments(); if (arguments != null) { mSearchKey = arguments.getString(EntranceUtils.KEY_SEARCHKEY); + mQuestionsEntity = arguments.getParcelable(QuestionsDetailEntity.TAG); } getCommunitiesTags(); mAgreePostPic = null; @@ -179,7 +186,6 @@ public class QuestionsEditFragment extends NormalFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - setNavigationTitle(UserManager.getInstance().getCommunityName(getContext())); mPicRv.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.HORIZONTAL, false)); if (!TextUtils.isEmpty(mSearchKey)) { if (mSearchKey.length() > QUESTION_TITLE_MAX_LENGTH) { @@ -209,9 +215,9 @@ public class QuestionsEditFragment extends NormalFragment { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().length() == 0) { - addQuestionsIndexFragment(false, null); + addQuestionsIndexFragment(null); } else { - addQuestionsIndexFragment(true, s.toString()); + addQuestionsIndexFragment(s.toString()); } if (s.length() > QUESTION_TITLE_MAX_LENGTH) { @@ -229,24 +235,43 @@ public class QuestionsEditFragment extends NormalFragment { } }); + if (mQuestionsEntity != null) { + initEditQuestion(); + setNavigationTitle("编辑问题"); + } else { + setNavigationTitle(UserManager.getInstance().getCommunityName(getContext())); + } } - private void addQuestionsIndexFragment(boolean isShow, String searchKey) { + + // 编辑问题 + void initEditQuestion() { + List images = mQuestionsEntity.getImages(); + mTitle.setText(mQuestionsEntity.getTitle()); + mContent.setText(mQuestionsEntity.getDescription()); + for (String image : images) { + mAdapter.addFileList(image); + } + } + + public void showSearchIndexLayout(boolean isShow) { if (isShow) { mIndexView.setVisibility(View.VISIBLE); } else { mIndexView.setVisibility(View.GONE); - return; } + } + private void addQuestionsIndexFragment(String searchKey) { FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); Fragment fragment = getChildFragmentManager().findFragmentByTag(QuestionsEditIndexFragment.class.getSimpleName()); if (fragment != null && fragment instanceof QuestionsEditIndexFragment) { - ((QuestionsEditIndexFragment) fragment).search(""); // TODO: 23/03/18 + ((QuestionsEditIndexFragment) fragment).search(searchKey); } else { QuestionsEditIndexFragment indexFragment = new QuestionsEditIndexFragment(); Bundle args = new Bundle(); args.putString(EntranceUtils.KEY_ENTRANCE, mEntrance); + args.putString(EntranceUtils.KEY_QUESTIONS_SEARCH_KEY, searchKey); indexFragment.setArguments(args); transaction.add(R.id.questionsedit_index, indexFragment, QuestionsEditIndexFragment.class.getSimpleName()); } @@ -268,7 +293,7 @@ public class QuestionsEditFragment extends NormalFragment { try { int statusCode = response.getInt("statusCode"); if (statusCode == HttpURLConnection.HTTP_OK) { - mAdapter.addFileList(response.getString("icon")); + mAdapter.addFileList(response.getString("url")); } else if (statusCode == 403) { toast("图片违规"); } else { @@ -297,7 +322,7 @@ public class QuestionsEditFragment extends NormalFragment { .subscribe(new Response>() { @Override public void onResponse(List response) { - mNetWordTagList = response; + mAllTagList.addAll(response); } @Override @@ -328,8 +353,20 @@ public class QuestionsEditFragment extends NormalFragment { String jsonBody = GsonUtils.Companion.getInstance().toJson(entity); Utils.log("postQuestions->Body:" + jsonBody); RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonBody); - RetrofitManager.getInstance(getContext()).getApi() - .postQuestions(body, UserManager.getInstance().getCommunityId(getContext())) + Observable responseBodyObservable; + + if (mQuestionsEntity != null) { + responseBodyObservable = RetrofitManager.getInstance(getContext()).getApi() + .patchQuestions(body, mQuestionsEntity.getId()); + mQuestionsEntity.setTags(mTagList); + mQuestionsEntity.setImages(imgs); + mQuestionsEntity.setTitle(title); + mQuestionsEntity.setDescription(content); + } else { + responseBodyObservable = RetrofitManager.getInstance(getContext()).getApi() + .postQuestions(body, UserManager.getInstance().getCommunityId(getContext())); + } + responseBodyObservable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { @@ -339,12 +376,19 @@ public class QuestionsEditFragment extends NormalFragment { mPostDialog.dismissAllowingStateLoss(); toast("提交成功"); try { - JSONObject object = new JSONObject(response.string()); if (getActivity() != null) { - Bundle bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, object.getString("_id")); - bundle.putString(EntranceUtils.KEY_ENTRANCE, "(回答编辑)"); - NormalActivity.startFragment(getContext(), QuestionsDetailFragment.class, bundle); + if (mQuestionsEntity != null) { + Intent data = new Intent(); + data.putExtra(QuestionsDetailEntity.TAG, mQuestionsEntity); + getActivity().setResult(Activity.RESULT_OK, data); + } else { + JSONObject object = new JSONObject(response.string()); + Bundle bundle = new Bundle(); + bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, object.getString("_id")); + bundle.putString(EntranceUtils.KEY_ENTRANCE, "(回答编辑)"); + NormalActivity.startFragment(getContext(), QuestionsDetailFragment.class, bundle); + } + if (mTagDialog != null) mTagDialog.dismiss(); getActivity().finish(); } } catch (Exception e) { @@ -412,13 +456,40 @@ public class QuestionsEditFragment extends NormalFragment { }); } + private void addTagByTitle() { + RetrofitManager.getInstance(getContext()) + .getApi() + .getQuestionTagsByTitle(UserManager.getInstance().getCommunityId(getContext()), mTitle.getText().toString()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + mTagByTitle.clear(); + if (response.size() <= 5) { + mTagByTitle.addAll(response); + } else { + for (int i = 0; i < 5; i++) { + mTagByTitle.add(response.get(i)); + } + } + showTagDialog(); + } + + @Override + public void onFailure(HttpException e) { + + } + }); + } + private void showTagDialog() { View view = LayoutInflater.from(getContext()).inflate(R.layout.questions_edit_tag, null); - Dialog dialog = new Dialog(getActivity()); - dialog.setContentView(view); - dialog.setCanceledOnTouchOutside(false); - dialog.setCancelable(false); - Window window = dialog.getWindow(); + mTagDialog = new Dialog(getActivity()); + mTagDialog.setContentView(view); + mTagDialog.setCanceledOnTouchOutside(false); + mTagDialog.setCancelable(false); + Window window = mTagDialog.getWindow(); if (window != null) { window.setGravity(Gravity.BOTTOM); window.setBackgroundDrawable(new ColorDrawable(0)); @@ -430,8 +501,7 @@ public class QuestionsEditFragment extends NormalFragment { mTagFl = view.findViewById(R.id.questions_edit_tag); View add = view.findViewById(R.id.questions_edit_tag_add); view.findViewById(R.id.questions_edit_tag_cancel).setOnClickListener(v -> { - dialog.dismiss(); - mAllTagList.clear(); + mTagDialog.dismiss(); mTagList.clear(); }); view.findViewById(R.id.questions_edit_tag_positive).setOnClickListener(v -> postQuestions(mAdapter.getFileList())); @@ -443,12 +513,20 @@ public class QuestionsEditFragment extends NormalFragment { } }); - // init default tag - for (int i = mNetWordTagList.size() - 1; i >= 0; i--) { - addTag(mNetWordTagList.get(i), false); + if (mQuestionsEntity == null || mQuestionsEntity.getTags().size() == 0) { + // init default tag + for (int i = mAllTagList.size() - 1; i >= 0; i--) { + String tag = mAllTagList.get(i); + addTag(tag, mTagByTitle.contains(tag)); + } + } else { + List tags = mQuestionsEntity.getTags(); + for (int i = tags.size() - 1; i >= 0; i--) { + addTag(tags.get(i), true); + } } + mTagDialog.show(); } - dialog.show(); } @@ -466,12 +544,16 @@ public class QuestionsEditFragment extends NormalFragment { input.setOnEditorActionListener((v, actionId, event) -> { if (actionId == EditorInfo.IME_ACTION_DONE) { - String nickname = input.getText().toString().trim(); - if (TextUtils.isEmpty(nickname)) { + String tag = input.getText().toString().trim(); + if (TextUtils.isEmpty(tag)) { toast(R.string.vote_empty_hint); return true; } - addTag(nickname, true); + if (mAllTagList.contains(tag)) { + toast("标签已存在"); + } else { + addTag(tag, true); + } dialog.dismiss(); return true; } @@ -485,12 +567,16 @@ public class QuestionsEditFragment extends NormalFragment { // 确定按钮 TextView confirm = view.findViewById(R.id.dialog_nickname_confirm); confirm.setOnClickListener(v -> { - String nickname = input.getText().toString().trim(); - if (TextUtils.isEmpty(nickname)) { + String tag = input.getText().toString().trim(); + if (TextUtils.isEmpty(tag)) { toast(R.string.vote_empty_hint); return; } - addTag(nickname, true); + if (mAllTagList.contains(tag)) { + toast("标签已存在"); + } else { + addTag(tag, true); + } dialog.dismiss(); }); @@ -504,12 +590,6 @@ public class QuestionsEditFragment extends NormalFragment { } private void addTag(String tag, boolean isAdd) { - if (mAllTagList.contains(tag)) { - toast("标签已经存在"); - return; - } - mAllTagList.add(tag); - View view = LayoutInflater.from(getContext()).inflate(R.layout.questionsdedit_tag_item, null); TextView tagTv = (TextView) view; tagTv.setText(tag); diff --git a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexAdapter.java index 68e879da1d..d929b167fc 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexAdapter.java @@ -11,17 +11,14 @@ import com.gh.base.OnListClickListener; import com.gh.common.constant.ItemViewType; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.ask.entity.AskSearchEntity; -import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.ask.entity.QuestionsIndexEntity; import com.gh.gamecenter.baselist.ListAdapter; -import java.util.List; - /** * Created by khy on 22/03/18. */ -public class QuestionsEditIndexAdapter extends ListAdapter { +public class QuestionsEditIndexAdapter extends ListAdapter { private OnListClickListener mListClickListener; private String mSearchKey; @@ -30,37 +27,10 @@ public class QuestionsEditIndexAdapter extends ListAdapter { super(context); mListClickListener = listClickListener; } -// @Override -// protected void setListData(List listData) { -// if (listData == null) { -// if (mEntityList != null) mEntityList.clear(); -// } else { -// mEntityList = new ArrayList<>(replayKeyword(listData)); -// } -// notifyDataSetChanged(); -// } - private List replayKeyword(List listData) { - for (int i = 0; i < listData.size(); i++) { - if (!TextUtils.isEmpty(mSearchKey)) { - AskSearchEntity entity = listData.get(i); - String brief = entity.getBrief(); - if (!TextUtils.isEmpty(brief)) { - brief = brief.replace("", "").replace("", "") - .replace(mSearchKey, getHtmlKeyword()); - entity.setBrief(brief); - } - String title = entity.getQuestions().getTitle(); - if (!TextUtils.isEmpty(title)) { - title = title.replace("", "").replace("", "") - .replace(mSearchKey, getHtmlKeyword()); - Questions questions = entity.getQuestions(); - questions.setTitle(title); - entity.setQuestions(questions); - } - } - } - return listData; + private String replayKeyword(String title) { + if (TextUtils.isEmpty(mSearchKey)) return title; + return title.replaceAll(mSearchKey, getHtmlKeyword()); } private String getHtmlKeyword() { @@ -93,12 +63,11 @@ public class QuestionsEditIndexAdapter extends ListAdapter { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case ItemViewType.ITEM_BODY: - AskSearchEntity searchEntity = mEntityList.get(position); - Questions questions = searchEntity.getQuestions(); + QuestionsIndexEntity searchEntity = mEntityList.get(position); QuestionsEditIndexViewHolder viewHolder = (QuestionsEditIndexViewHolder) holder; - viewHolder.mIndexTitle.setText(Html.fromHtml(questions.getTitle())); + viewHolder.mIndexTitle.setText(Html.fromHtml(replayKeyword(searchEntity.getTitle()))); viewHolder.setClickData(searchEntity); - viewHolder.mIndexAnswerCount.setText(mContext.getString(R.string.ask_answer_count, questions.getAnswerCount())); + viewHolder.mIndexAnswerCount.setText(mContext.getString(R.string.ask_answer_count, searchEntity.getAnswerCount())); break; case ItemViewType.ITEM_FOOTER: FooterViewHolder footerViewHolder = (FooterViewHolder) holder; diff --git a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexFragment.java b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexFragment.java index 3b7ac54d4a..493d4b5c1f 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditIndexFragment.java @@ -1,15 +1,18 @@ package com.gh.gamecenter.ask; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.View; import com.gh.common.util.EntranceUtils; +import com.gh.common.util.UrlFilterUtils; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; -import com.gh.gamecenter.ask.entity.AskSearchEntity; -import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.ask.entity.QuestionsIndexEntity; import com.gh.gamecenter.ask.questionsdetail.QuestionsDetailFragment; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; @@ -26,9 +29,11 @@ import rx.Observable; * Created by khy on 22/03/18. */ -public class QuestionsEditIndexFragment extends ListFragment { +public class QuestionsEditIndexFragment extends ListFragment { private QuestionsEditIndexAdapter mAdapter; + private String mSearchKey; + protected RecyclerView.ItemDecoration getItemDecoration() { return new VerticalItemDecoration(getContext(), 1, false); } @@ -39,9 +44,42 @@ public class QuestionsEditIndexFragment extends ListFragment> provideDataObservable(int offset) { - return RetrofitManager.getInstance(getContext()).getApi().getAskSearch(UserManager.getInstance().getCommunityId(getContext()), "一", offset); + public void onCreate(@Nullable Bundle savedInstanceState) { + if (getArguments() != null) + mSearchKey = getArguments().getString(EntranceUtils.KEY_QUESTIONS_SEARCH_KEY, null); + super.onCreate(savedInstanceState); + } + @Override + public Observable> provideDataObservable(int offset) { + if (TextUtils.isEmpty(mSearchKey)) { + Fragment parentFragment = getParentFragment(); + if (parentFragment instanceof QuestionsEditFragment) { + ((QuestionsEditFragment) parentFragment).showSearchIndexLayout(false); + } + return null; + } + return RetrofitManager.getInstance(getContext()).getApi().getAskSearchByTitle( + UserManager.getInstance().getCommunityId(getContext()), + UrlFilterUtils.getFilterQuery("keyword", mSearchKey), offset); + } + + @Override + public void onLoadEmpty() { + super.onLoadEmpty(); + Fragment parentFragment = getParentFragment(); + if (parentFragment instanceof QuestionsEditFragment) { + ((QuestionsEditFragment) parentFragment).showSearchIndexLayout(false); + } + } + + @Override + public void onLoadDone() { + super.onLoadDone(); + Fragment parentFragment = getParentFragment(); + if (parentFragment instanceof QuestionsEditFragment) { + ((QuestionsEditFragment) parentFragment).showSearchIndexLayout(true); + } } @Override @@ -54,10 +92,9 @@ public class QuestionsEditIndexFragment extends ListFragment { +public class QuestionsEditIndexViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.questions_edit_index_title) TextView mIndexTitle; @BindView(R.id.questions_edit_index_answer_count) diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/InviteEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/InviteEntity.kt index 82f9380545..6891205fb6 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/InviteEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/InviteEntity.kt @@ -1,6 +1,5 @@ package com.gh.gamecenter.ask.entity -import com.gh.gamecenter.entity.UserEntity import com.google.gson.annotations.SerializedName /** @@ -11,7 +10,9 @@ class InviteEntity { @SerializedName("_id") var id: String? = null - var user: UserEntity? = null + var icon: String? = null + + var name: String? = null @SerializedName("answer_count") var answerCount: Int = 0 diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt index 879b6dcded..144b3f4b25 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt @@ -12,8 +12,8 @@ class MeEntity() : Parcelable { @SerializedName("is_community_voted") var isCommunityVoted: Boolean = false - @SerializedName("is_expert_invited") - var isExpertInvited: Boolean = false + @SerializedName("is_user_invite") + var isUserInvite: Boolean = false @SerializedName("is_answer_voted") var isAnswerVoted: Boolean = false @@ -35,21 +35,23 @@ class MeEntity() : Parcelable { constructor(parcel: Parcel) : this() { isCommunityVoted = parcel.readByte() != 0.toByte() - isExpertInvited = parcel.readByte() != 0.toByte() + isUserInvite = parcel.readByte() != 0.toByte() isAnswerVoted = parcel.readByte() != 0.toByte() isAnswerOwn = parcel.readByte() != 0.toByte() isAnswerFavorite = parcel.readByte() != 0.toByte() isQuestionFollowed = parcel.readByte() != 0.toByte() + isQuestionOwn = parcel.readByte() != 0.toByte() myAnswerId = parcel.readString() } override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeByte(if (isCommunityVoted) 1 else 0) - parcel.writeByte(if (isExpertInvited) 1 else 0) + parcel.writeByte(if (isUserInvite) 1 else 0) parcel.writeByte(if (isAnswerVoted) 1 else 0) parcel.writeByte(if (isAnswerOwn) 1 else 0) parcel.writeByte(if (isAnswerFavorite) 1 else 0) parcel.writeByte(if (isQuestionFollowed) 1 else 0) + parcel.writeByte(if (isQuestionOwn) 1 else 0) parcel.writeString(myAnswerId) } diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsIndexEntity.java b/app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsIndexEntity.java new file mode 100644 index 0000000000..a4a710474d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsIndexEntity.java @@ -0,0 +1,42 @@ +package com.gh.gamecenter.ask.entity; + +import com.google.gson.annotations.SerializedName; + +/** + * Created by khy on 28/03/18. + */ + +public class QuestionsIndexEntity { + + @SerializedName("_id") + private String id; + + private String title; + + @SerializedName("answer_count") + private int answerCount; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getAnswerCount() { + return answerCount; + } + + public void setAnswerCount(int answerCount) { + this.answerCount = answerCount; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java index cd6405a48e..440bb8735e 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java @@ -204,7 +204,7 @@ public class AnswerEditFragment extends NormalFragment { try { int statusCode = response.getInt("statusCode"); if (statusCode == HttpURLConnection.HTTP_OK) { - mMapImg.put(picturePath, response.getString("icon")); + mMapImg.put(picturePath, response.getString("url")); mEditContent.insertImage(FILE_HOST + picturePath); } else if (statusCode == 403) { toast("图片违规"); diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java index 0fd4734c4f..fcf4a06712 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java @@ -200,18 +200,9 @@ public class QuestionsDetailAdapter extends ListAdapter { List tags = mQuestionsDetailEntity.getTags(); holder.mTagRl.removeAllViews(); + addTag(holder.mTagRl, mQuestionsDetailEntity.getCommunityName()); for (String tag : tags) { - View view = LayoutInflater.from(mContext).inflate(R.layout.questionsdedit_tag_item, null); - TextView tagTv = (TextView) view; - tagTv.setText(tag); - tagTv.setBackgroundResource(R.drawable.questions_detail_tag_bg); - tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.hint)); - FlexboxLayout.LayoutParams params = new FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - params.setMargins(0, DisplayUtils.dip2px(mContext, 5), DisplayUtils.dip2px(mContext, 15), - DisplayUtils.dip2px(mContext, 5)); - tagTv.setLayoutParams(params); - holder.mTagRl.addView(view); + addTag(holder.mTagRl, tag); } String description = mQuestionsDetailEntity.getDescription(); @@ -279,6 +270,20 @@ public class QuestionsDetailAdapter extends ListAdapter { }); } + private void addTag(FlexboxLayout mTagRl, String tag) { + View view = LayoutInflater.from(mContext).inflate(R.layout.questionsdedit_tag_item, null); + TextView tagTv = (TextView) view; + tagTv.setText(tag); + tagTv.setBackgroundResource(R.drawable.questions_detail_tag_bg); + tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.hint)); + FlexboxLayout.LayoutParams params = new FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + params.setMargins(0, DisplayUtils.dip2px(mContext, 5), DisplayUtils.dip2px(mContext, 15), + DisplayUtils.dip2px(mContext, 5)); + tagTv.setLayoutParams(params); + mTagRl.addView(view); + } + private void setAnswerTv(TextView answerTv, @StringRes int answerTvId) { String answerText = mContext.getString(answerTvId); answerTv.setText(answerText); diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java index 203a35e485..4b87aa8c7f 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java @@ -32,6 +32,7 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.ViewImageActivity; import com.gh.gamecenter.ask.AnswerDetailFragment; +import com.gh.gamecenter.ask.QuestionsEditFragment; import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.QuestionsDetailEntity; import com.gh.gamecenter.ask.questionsdetail.invite.QuestionsInviteWrapperFragment; @@ -67,6 +68,7 @@ public class QuestionsDetailFragment extends ListFragment { dialog.dismiss(); if ("编辑".equals(title.getText().toString())) { - // 跳转编辑问题页面 + Bundle bundle = new Bundle(); + bundle.putParcelable(QuestionsDetailEntity.TAG, mQuestionsDetailEntity); + NormalActivity.startFragmentForResult(getContext(), QuestionsEditFragment.class, bundle, QUESTIONS_EDIT_REQUEST); } else { // 跳转意见反馈 SuggestionActivity.startSuggestionActivity(getContext(), 1, "report", "问题举报:"); @@ -369,8 +378,6 @@ public class QuestionsDetailFragment extends ListFragment tags = response.getTags(); - tags.add(0, response.getCommunityName()); // 原来的[社区名字]移到问题标题的顶部,标签的左侧 mQuestionsDetailEntity = response; mAdapter.setQuestionsEntity(response); mListViewModel.load(LoadType.REFRESH); diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteAdapter.java index 740eb898d6..a3ce7dac67 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteAdapter.java @@ -55,7 +55,7 @@ public class QuestionsInviteAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.questionsinvite_item, parent, false); - return new QuestionsInviteViewHolder(view, mEntityList, mListClickListener); + return new QuestionsInviteViewHolder(view, mListClickListener); default: return null; } @@ -85,7 +85,7 @@ public class QuestionsInviteAdapter extends ListAdapter { if (id.equals(inviteEntity.getId())) { MeEntity me = inviteEntity.getMe(); if (me == null) me = new MeEntity(); - me.setExpertInvited(true); + me.setUserInvite(true); inviteEntity.setMe(me); notifyDataSetChanged(); break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteFragment.java index feee35b4d8..e7bc2b15ab 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/invite/QuestionsInviteFragment.java @@ -10,6 +10,7 @@ import android.view.View; import com.gh.common.util.AskErrorResponseUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.EntranceUtils; +import com.gh.common.util.UrlFilterUtils; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.entity.InviteEntity; @@ -78,8 +79,14 @@ public class QuestionsInviteFragment extends ListFragment> provideDataObservable(int offset) { - return RetrofitManager.getInstance(getContext()).getApi().getInviteExperts(mQuestionsDetailEntity.getId() - , TextUtils.isEmpty(mSearchKey) ? offset : offset + 10); + if (TextUtils.isEmpty(mSearchKey)) { + return RetrofitManager.getInstance(getContext()).getApi().getInviteExperts(mQuestionsDetailEntity.getId(), offset); + } else { + return RetrofitManager.getInstance(getContext()).getApi().getSearchInviteExperts(mQuestionsDetailEntity.getId() + , UrlFilterUtils.getFilterQuery("keyword", mSearchKey), offset); + } + + } @Override @@ -91,10 +98,9 @@ public class QuestionsInviteFragment extends ListFragment mEntityList = (List) data; - InviteEntity inviteEntity = mEntityList.get(position - ListAdapter.TOP_ITEM_COUNT); + InviteEntity inviteEntity = (InviteEntity) data; MeEntity me = inviteEntity.getMe(); - if (me == null || !me.isExpertInvited()) + if (me == null || !me.isUserInvite()) CheckLoginUtils.checkLogin(getContext(), () -> { postInvite(inviteEntity.getId()); }); @@ -110,10 +116,10 @@ public class QuestionsInviteFragment extends ListFragment { @BindView(R.id.questionsinvite_item_icon) public SimpleDraweeView mIcon; @BindView(R.id.questionsinvite_item_name) @@ -33,21 +32,18 @@ public class QuestionsInviteViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.questionsinvite_item_invite) public TextView mInvite; - public QuestionsInviteViewHolder(View itemView, Object data, OnListClickListener listClickListener) { - super(itemView, data, listClickListener); + public QuestionsInviteViewHolder(View itemView, OnListClickListener listClickListener) { + super(itemView, listClickListener); mInvite.setOnClickListener(this); } public void initQuestionsInviteViewHolder(Context context, InviteEntity entity) { - - UserEntity user = entity.getUser(); - if (user != null) { - ImageUtils.Companion.display(mIcon, user.getIcon()); - mName.setText(user.getName()); - } + setClickData(entity); + ImageUtils.Companion.display(mIcon, entity.getIcon()); + mName.setText(entity.getName()); MeEntity me = entity.getMe(); - if (me != null && me.isExpertInvited()) { + if (me != null && me.isUserInvite()) { mInvite.setTextColor(ContextCompat.getColor(context, R.color.content)); mInvite.setText(R.string.invited); mInvite.setBackgroundResource(R.drawable.border_suggest_bg); diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java index 2dbbfc80bd..586d50d479 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java @@ -11,6 +11,7 @@ import android.view.View; import com.gh.common.util.AskLogUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.EntranceUtils; +import com.gh.common.util.UrlFilterUtils; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; @@ -86,7 +87,8 @@ public class AskSearchFragment extends ListFragment> provideDataObservable(int offset) { if (TextUtils.isEmpty(mSearchKey)) return null; - return RetrofitManager.getInstance(getContext()).getApi().getAskSearch(UserManager.getInstance().getCommunityId(getContext()), mSearchKey, offset); + return RetrofitManager.getInstance(getContext()).getApi().getAskSearch(UserManager.getInstance().getCommunityId(getContext()) + , UrlFilterUtils.getFilterQuery("keyword", mSearchKey), offset); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/kaifu/KaiFuWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/kaifu/KaiFuWrapperFragment.java index c1f42cec16..b1a0aaed35 100644 --- a/app/src/main/java/com/gh/gamecenter/kaifu/KaiFuWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/kaifu/KaiFuWrapperFragment.java @@ -44,9 +44,7 @@ public class KaiFuWrapperFragment extends NormalFragment { @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - setNavigationTitle(R.string.title_kaifu); - initMenu(R.menu.menu_button); - mResetMenuItem = getItemMenu(R.id.menu_button); + createMenu(); } @Override @@ -54,12 +52,11 @@ public class KaiFuWrapperFragment extends NormalFragment { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - if (mResetMenuItem != null) { - mResetMenuItem.setTitle(R.string.menu_text_reset); - mResetMenuItem.setVisible(false); - final TextView textView = mResetMenuItem.getActionView().findViewById(R.id.tv_menu_button); - textView.setText(R.string.menu_text_reset); - } + if (mResetMenuItem == null) createMenu(); + mResetMenuItem.setTitle(R.string.menu_text_reset); + mResetMenuItem.setVisible(false); + final TextView textView = mResetMenuItem.getActionView().findViewById(R.id.tv_menu_button); + textView.setText(R.string.menu_text_reset); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); @@ -68,7 +65,15 @@ public class KaiFuWrapperFragment extends NormalFragment { fragmentTransaction.commit(); } + private void createMenu() { + if (mResetMenuItem != null) return; + setNavigationTitle(R.string.title_kaifu); + initMenu(R.menu.menu_button); + mResetMenuItem = getItemMenu(R.id.menu_button); + } + private void resetFragment() { + if (mGameKaiFuFragment == null) return; mKaiFuFragment.setCurPage(mGameKaiFuFragment.getCurPage()); mResetMenuItem.setVisible(false); diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 21b0e1599b..be7a110e1f 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -8,6 +8,7 @@ import com.gh.gamecenter.ask.entity.AskTagGroupsEntity; import com.gh.gamecenter.ask.entity.InviteEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.ask.entity.QuestionsDetailEntity; +import com.gh.gamecenter.ask.entity.QuestionsIndexEntity; import com.gh.gamecenter.entity.AppEntity; import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.CommentnumEntity; @@ -302,7 +303,7 @@ public interface ApiService { /** * 获取开服表数据 */ - @GET("/games/servers") + @GET("games/servers") Observable> getKaiFuData(@Query("type") String type, @Query("day") String day, @Query("offset") int offset, @Query("limit") int limit); @@ -742,17 +743,30 @@ public interface ApiService { @GET("questions/{question_id}/experts") Observable> getInviteExperts(@Path("question_id") String questionsId, @Query("offset") int offset); + /** + * 搜索社区达人列表 + */ + @GET("questions/{question_id}/experts:search") + Observable> getSearchInviteExperts(@Path("question_id") String questionId, + @Query("filter") String filter, @Query("offset") int offset); + /** * 邀请达人回答社区问题 */ @POST("questions/{question_id}:invite") - Observable postInvite(@Body RequestBody body, @Path("questions_id") String questionsId); + Observable postInvite(@Body RequestBody body, @Path("question_id") String questionId); /** * 搜索社区问题 */ - @GET("communities/{community_id}/questions:search") - Observable> getAskSearch(@Path("community_id") String communityId, @Query("keyword") String keyword, @Query("offset") int offset); + @GET("communities/{community_id}:search") + Observable> getAskSearch(@Path("community_id") String communityId, @Query("filter") String filter, @Query("offset") int offset); + + /** + * 搜索社区问题(编辑问题索引) + */ + @GET("communities/{community_id}/questions:search?view=digest") + Observable> getAskSearchByTitle(@Path("community_id") String communityId, @Query("filter") String filter, @Query("offset") int offset); /** * 用户对社区进行投票 @@ -784,12 +798,24 @@ public interface ApiService { @GET("communities/{community_id}/tags") Observable> getCommunitiesTags(@Path("community_id") String communityId); + /** + * 根据问题标题匹配标签问题标签 + */ + @GET("communities/{community_id}/tags") + Observable> getQuestionTagsByTitle(@Path("community_id") String communityId, @Query("filter") String filter); + /** * 添加社区问题 */ @POST("communities/{community_id}/questions") Observable postQuestions(@Body RequestBody body, @Path("community_id") String communityId); + /** + * 添加社区问题 + */ + @POST("questions/{question_id}") + Observable patchQuestions(@Body RequestBody body, @Path("question_id") String questionId); + /** * 对社区回答点赞 */ diff --git a/app/src/main/res/layout/questionsdetail_item.xml b/app/src/main/res/layout/questionsdetail_item.xml index a16aa0c2a6..c5a26f4c27 100644 --- a/app/src/main/res/layout/questionsdetail_item.xml +++ b/app/src/main/res/layout/questionsdetail_item.xml @@ -9,11 +9,13 @@ + android:orientation = "horizontal" + android:paddingLeft = "20dp" + android:paddingRight = "20dp" > + +