From 5f09fd1fa3e5950d37db40df2e5fde6999cf0ae6 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Mon, 2 Apr 2018 14:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E7=AD=94=E7=B2=BE=E9=80=89=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=B8=93=E9=A2=98=E5=8A=9F=E8=83=BD(=E5=AE=8C?= =?UTF-8?q?=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/fragment/BaseFragment.java | 6 +- .../com/gh/gamecenter/SuggestionActivity.java | 31 ++-- .../com/gh/gamecenter/ask/AskFragment.java | 2 +- .../ask/AskQuestionsHotAdapter.java | 82 ---------- .../ask/AskQuestionsRecommendsAdapter.java | 151 ++++++++++++++++++ ...va => AskQuestionsRecommendsFragment.java} | 99 ++++++++++-- ... => AskQuestionsRecommendsViewHolder.java} | 4 +- ...a => AskQuestionsRecommendsViewModel.java} | 59 +++++-- .../gamecenter/ask/AskSubjectPageAdapter.java | 56 +++++++ .../gamecenter/ask/AskSubjectViewHolder.java | 27 ++++ .../gh/gamecenter/ask/SelectGameFragment.java | 20 +-- .../ask/entity/AskSubjectEntity.java | 105 ++++++++++++ .../gamecenter/ask/myask/MyAnswerAdapter.java | 2 +- .../ask/myask/MyAnswerFragment.java | 10 +- .../gamecenter/ask/myask/MyDraftAdapter.java | 2 +- .../gamecenter/ask/myask/MyDraftFragment.java | 4 +- .../questionsdetail/AnswerFoldAdapter.java | 2 +- .../questionsdetail/AnswerFoldFragment.java | 3 +- .../ask/questionsdetail/AnswerViewHolder.java | 10 +- .../QuestionsDetailAdapter.java | 2 +- .../QuestionsDetailFragment.java | 4 +- .../ask/subject/AskSubjectAdapter.java | 103 ++++++++++++ .../ask/subject/AskSubjectFragment.java | 96 +++++++++++ .../ask/subject/AskSubjectViewHolder.java | 20 +++ .../ask/subject/AskSubjectViewModel.java | 49 ++++++ .../gh/gamecenter/baselist/LoadStatus.java | 5 - .../gamecenter/collection/AnswerAdapter.java | 2 +- .../gamecenter/collection/AnswerFragment.java | 13 +- .../gh/gamecenter/fragment/LoginFragment.java | 42 +++-- .../message/MessageNormalFragment.java | 35 ++-- .../message/NewMessageFragment.java | 34 ++-- .../message/NewMessageItemViewHolder.java | 2 +- .../retrofit/service/ApiService.java | 15 +- .../message_image_placeholder.png | Bin 0 -> 14833 bytes app/src/main/res/drawable/ask_subject_pb.xml | 12 ++ .../res/layout/ask_recommends_subject.xml | 22 +++ .../layout/ask_recommends_subject_item.xml | 64 ++++++++ .../main/res/layout/ask_subject_top_item.xml | 66 ++++++++ app/src/main/res/layout/message_item.xml | 8 +- 39 files changed, 1027 insertions(+), 242 deletions(-) delete mode 100644 app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotAdapter.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsAdapter.java rename app/src/main/java/com/gh/gamecenter/ask/{AskQuestionsHotFragment.java => AskQuestionsRecommendsFragment.java} (56%) rename app/src/main/java/com/gh/gamecenter/ask/{AskQuestionsHotViewHolder.java => AskQuestionsRecommendsViewHolder.java} (90%) rename app/src/main/java/com/gh/gamecenter/ask/{AskQuestionsHotViewModel.java => AskQuestionsRecommendsViewModel.java} (71%) create mode 100644 app/src/main/java/com/gh/gamecenter/ask/AskSubjectPageAdapter.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/AskSubjectViewHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/entity/AskSubjectEntity.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectAdapter.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectFragment.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewModel.java create mode 100644 app/src/main/res/drawable-xhdpi/message_image_placeholder.png create mode 100644 app/src/main/res/drawable/ask_subject_pb.xml create mode 100644 app/src/main/res/layout/ask_recommends_subject.xml create mode 100644 app/src/main/res/layout/ask_recommends_subject_item.xml create mode 100644 app/src/main/res/layout/ask_subject_top_item.xml diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment.java b/app/src/main/java/com/gh/base/fragment/BaseFragment.java index 329915e138..cb182050da 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment.java @@ -51,16 +51,16 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB protected final Handler mBaseHandler = new BaseFragment.BaseHandler(this); protected static class BaseHandler extends Handler { - private final WeakReference mfragmentWeakReference; + private final WeakReference mFragmentWeakReference; BaseHandler(BaseFragment fragment) { - mfragmentWeakReference = new WeakReference<>(fragment); + mFragmentWeakReference = new WeakReference<>(fragment); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); - mfragmentWeakReference.get().handleMessage(msg); + mFragmentWeakReference.get().handleMessage(msg); } } diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index 3038a5c388..7336b88b6a 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -41,7 +41,6 @@ import com.gh.gamecenter.entity.InstallGameEntity; import com.gh.gamecenter.entity.SuggestionTypeEntity; import com.gh.gamecenter.entity.UserInfoEntity; import com.gh.gamecenter.manager.UserManager; -import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.suggest.SuggestPicAdapter; @@ -49,6 +48,7 @@ import com.gh.gamecenter.suggest.SuggestSelectGameAdapter; import com.gh.gamecenter.suggest.SuggestTypeAdapter; import com.google.gson.Gson; import com.halo.assistant.HaloApp; +import com.lightgame.config.CommonDebug; import com.lightgame.download.FileUtils; import com.lightgame.utils.Util_System_Keyboard; import com.lightgame.utils.Util_System_Phone_State; @@ -74,6 +74,7 @@ import butterknife.BindView; import butterknife.OnClick; import okhttp3.MediaType; import okhttp3.RequestBody; +import okhttp3.ResponseBody; import retrofit2.HttpException; import rx.Observable; import rx.Observer; @@ -550,35 +551,29 @@ public class SuggestionActivity extends BaseActivity implements SuggestTypeAdapt RetrofitManager.getInstance(this).getApi().postSuggestion(body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new JSONObjectResponse() { + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { + public void onResponse(ResponseBody response) { if (postDialog != null) { postDialog.dismissAllowingStateLoss(); } - if (response.length() != 0) { - try { - if ("ok".equals(response.getString("status"))) { - toast("感谢您的反馈!"); - setResult(SUGGEST_TYPE_REQUEST); - finish(); - } else { - toast("提交失败,请稍后尝试!"); - } - } catch (JSONException e) { - e.printStackTrace(); - } - } else { - toast("提交失败,请稍后尝试!"); + toast("感谢您的反馈!"); + setResult(SUGGEST_TYPE_REQUEST); + finish(); + try { + Utils.log("sendSuggestion::onResponse->" + response.string()); + } catch (IOException e) { + e.printStackTrace(); } } @Override public void onFailure(HttpException e) { try { - if (e != null) { + if (CommonDebug.IS_DEBUG && e != null) { String string = e.response().errorBody().string(); + Utils.log("sendSuggestion::onFailure->" + string); } } catch (IOException e1) { e1.printStackTrace(); diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskFragment.java index 051d44da47..c90427597d 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskFragment.java @@ -114,7 +114,7 @@ public class AskFragment extends BaseFragment { private void initViewPager() { ArrayList fragmentList = new ArrayList<>(); - fragmentList.add(new AskQuestionsHotFragment()); + fragmentList.add(new AskQuestionsRecommendsFragment()); fragmentList.add(new AskQuestionsNewFragment()); mAskViewpager.setAdapter(new FragmentAdapter(getChildFragmentManager(), fragmentList)); mAskViewpager.setScrollable(false); diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotAdapter.java deleted file mode 100644 index 2ae9bab14e..0000000000 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotAdapter.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.gh.gamecenter.ask; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.view.ViewGroup; - -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.AnswerEntity; -import com.gh.gamecenter.baselist.ListAdapter; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by khy on 2/12/17. - */ - -public class AskQuestionsHotAdapter extends ListAdapter { - - private OnListClickListener mListClickListener; - - public AskQuestionsHotAdapter(Context context, OnListClickListener listClickListener) { - super(context); - mListClickListener = listClickListener; - } - - @Override - protected void setListData(List updateData) { -// super.setListData(updateData); 用DiffUtil会出现诡异的动画 - mEntityList = new ArrayList<>(updateData); - notifyDataSetChanged(); - } - - @Override - protected boolean areContentsTheSame(AnswerEntity oldItem, AnswerEntity newItem) { - return oldItem.getId() != null && oldItem.getId().equals(newItem.getId()); - } - - @Override - public int getItemViewType(int position) { - if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; - return ItemViewType.ITEM_BODY; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view; - switch (viewType) { - case ItemViewType.ITEM_FOOTER: - view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); - return new FooterViewHolder(view, mListClickListener); - case ItemViewType.ITEM_BODY: - view = mLayoutInflater.inflate(R.layout.ask_questions_hot_item, parent, false); - return new AskQuestionsHotViewHolder(view, mListClickListener); - default: - return null; - } - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - switch (getItemViewType(position)) { - case ItemViewType.ITEM_BODY: - ((AskQuestionsHotViewHolder) holder).initQuestionsHotViewHolder(mEntityList.get(position)); - break; - case ItemViewType.ITEM_FOOTER: - FooterViewHolder footerViewHolder = (FooterViewHolder) holder; - footerViewHolder.initItemPadding(); - footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); - break; - } - } - - @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/ask/AskQuestionsRecommendsAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsAdapter.java new file mode 100644 index 0000000000..9cc58c10f6 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsAdapter.java @@ -0,0 +1,151 @@ +package com.gh.gamecenter.ask; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; + +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.AnswerEntity; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.baselist.ListAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by khy on 2/12/17. + */ + +public class AskQuestionsRecommendsAdapter extends ListAdapter { + + public static final int MAX_PROGRESS = 300; + + private OnListClickListener mListClickListener; + private OnSubjectProgressListener mProgressListener; + + private List mSubjectEntity; + + private ProgressBar mSubjectProgressBar; + private ViewPager mSubjectViewPager; + + public AskQuestionsRecommendsAdapter(Context context, OnListClickListener listClickListener, OnSubjectProgressListener progressListener) { + super(context); + mProgressListener = progressListener; + mListClickListener = listClickListener; + } + + public void setSubjectEntity(List subjectEntity) { + mSubjectEntity = subjectEntity; + notifyDataSetChanged(); + } + + @Override + protected void setListData(List updateData) { +// super.setListData(updateData); 用DiffUtil会出现诡异的动画 + mEntityList = new ArrayList<>(updateData); + notifyDataSetChanged(); + } + + @Override + protected boolean areContentsTheSame(AnswerEntity oldItem, AnswerEntity newItem) { + return oldItem.getId() != null && oldItem.getId().equals(newItem.getId()); + } + + @Override + public int getItemViewType(int position) { + if (position == 0 && mSubjectEntity != null && mSubjectEntity.size() > 0) + return ItemViewType.ITEM_TOP; + if (position == getItemCount() - 1) + return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_TOP: + view = mLayoutInflater.inflate(R.layout.ask_recommends_subject, parent, false); + return new AskSubjectViewHolder(view); + case ItemViewType.ITEM_FOOTER: + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, mListClickListener); + case ItemViewType.ITEM_BODY: + view = mLayoutInflater.inflate(R.layout.ask_questions_hot_item, parent, false); + return new AskQuestionsRecommendsViewHolder(view, mListClickListener); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_TOP: + AskSubjectViewHolder subjectViewHolder = (AskSubjectViewHolder) holder; + subjectViewHolder.mSubjectProgress.setMax(MAX_PROGRESS); + mSubjectProgressBar = subjectViewHolder.mSubjectProgress; + mSubjectViewPager = subjectViewHolder.mSubjectViewPager; + if (subjectViewHolder.mSubjectViewPager.getAdapter() == null) { + subjectViewHolder.mSubjectViewPager.setAdapter(new AskSubjectPageAdapter(mContext, mSubjectEntity)); + mProgressListener.onStartProgress(); + subjectViewHolder.mSubjectViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + mProgressListener.onStartProgress(); // 每次滑动完成重新启动进度条 + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + break; + case ItemViewType.ITEM_BODY: + int index = mSubjectEntity == null ? position : position - TOP_ITEM_COUNT; + ((AskQuestionsRecommendsViewHolder) holder).initQuestionsHotViewHolder(mEntityList.get(index)); + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + } + } + + void setSubjectProgress(int progress) { + if (mSubjectProgressBar != null) mSubjectProgressBar.setProgress(progress); + if (progress == MAX_PROGRESS && mSubjectViewPager != null) { + int currentItem = mSubjectViewPager.getCurrentItem(); + mSubjectViewPager.setCurrentItem(++currentItem, true); + } + } + + @Override + public int getItemCount() { + int index = 0; + if (mSubjectEntity != null && mSubjectEntity.size() > 0) + index += TOP_ITEM_COUNT; + if (mEntityList != null) + index += mEntityList.size(); + if (mEntityList != null || mSubjectEntity != null && mSubjectEntity.size() > 0) + index += FOOTER_ITEM_COUNT; + return index; + } + + interface OnSubjectProgressListener { + void onStartProgress(); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java similarity index 56% rename from app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java rename to app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java index fc718512ff..7e01798c29 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java @@ -3,6 +3,7 @@ package com.gh.gamecenter.ask; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.os.Message; import android.support.annotation.Nullable; import android.view.View; @@ -15,6 +16,7 @@ import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.ask.questionsdetail.QuestionsDetailFragment; import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import butterknife.BindView; @@ -26,14 +28,34 @@ import static com.gh.gamecenter.ask.AskFragment.COMMUNITIES_SELECT_REQUEST; * Created by khy on 2/12/17. */ -public class AskQuestionsHotFragment extends ListFragment { +public class AskQuestionsRecommendsFragment extends ListFragment + implements AskQuestionsRecommendsAdapter.OnSubjectProgressListener { @BindView(R.id.reuse_nodata_skip_tv_btn) View mSkipHint; - private AskQuestionsHotAdapter mAdapter; + public static final int VIEWPAGER_INTERVAL = 3000; + + private AskQuestionsRecommendsAdapter mAdapter; + private CheckLoginUtils.OnLoginListener mOnLoginListener; + @Override + protected void handleMessage(Message msg) { + if (msg.what == 0) { // 验证码倒计时 + int arg1 = msg.arg1; + arg1++; + if (arg1 <= AskQuestionsRecommendsAdapter.MAX_PROGRESS) { + if (mAdapter != null) mAdapter.setSubjectProgress(arg1); + Message message = new Message(); + message.what = 0; + message.arg1 = arg1; + mBaseHandler.sendMessageDelayed(message + , VIEWPAGER_INTERVAL / AskQuestionsRecommendsAdapter.MAX_PROGRESS); + } + } + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -41,25 +63,51 @@ public class AskQuestionsHotFragment extends ListFragment { - if (status != null) { - switch (status) { - case REFRESH_FAILED: - toast("刷新失败"); + mListViewModel.getRefreshCount().observe(this, integer -> { + if (integer != null) { + switch (integer) { + case 0: + toast("已经没有新内容咯,请稍后再试"); break; - case REFRESH_LOADED: + case -1: + toast("获取失败,请检查网络设置"); break; - case REFRESH_OVER: - toast("刷新完毕"); + default: + toast("成功获取" + integer + "条新内容"); break; - } - if (mListRefresh.isRefreshing()) { - mListRefresh.setRefreshing(false); + } } + + if (mListRefresh.isRefreshing()) { + mListRefresh.setRefreshing(false); + } + }); + + mListViewModel.getSubjectLiveData().observe(this, entityList -> { + mAdapter.setSubjectEntity(entityList); }); } + @Override + public void onLoadEmpty() { + if (mListViewModel.getSubjectLiveData().getValue() != null) { + super.onLoadDone(); + mAdapter.loadChange(LoadStatus.LIST_OVER); + } else { + super.onLoadEmpty(); + } + } + + @Override + public void onLoadError() { + if (mListViewModel.getSubjectLiveData().getValue() != null) { + super.onLoadDone(); + mAdapter.loadChange(LoadStatus.LIST_FAILED); + } else { + super.onLoadError(); + } + } @Override protected int getLayoutId() { @@ -78,8 +126,8 @@ public class AskQuestionsHotFragment extends ListFragment { +public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.ask_item_usericon) @@ -36,7 +36,7 @@ public class AskQuestionsHotViewHolder extends BaseRecyclerViewHolder { +public class AskQuestionsRecommendsViewModel extends ListViewModel { + + /** + * 等于 0 刷新结束(没有内容了) + * 小于 0 刷新失败 + * 大于 0 刷新成功(数量) + */ + private MutableLiveData mRefreshCount = new MutableLiveData<>(); private MutableLiveData> mLiveData = new MutableLiveData<>(); + private MutableLiveData> mSubjectLiveData = new MediatorLiveData<>(); private MutableLiveData mLoadStatusLiveData = new MutableLiveData<>(); - public AskQuestionsHotViewModel(@NonNull Application application) { + public AskQuestionsRecommendsViewModel(@NonNull Application application) { super(application); - loadData(false, null); + loadAskSubjectColumn(); + } + + void loadAskSubjectColumn() { + RetrofitManager.getInstance(getApplication()).getApi() + .getAskSubjectColumn(UserManager.getInstance().getCommunityId(getApplication())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + super.onResponse(response); + mSubjectLiveData.postValue(response); + loadData(false, null); + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + loadData(false, null); + } + }); } void loadData(boolean isUp, String sequenceId) { Observable> askHot; String communityId = UserManager.getInstance().getCommunityId(getApplication()); if (TextUtils.isEmpty(sequenceId)) { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskHot(communityId, ""); + askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, ""); } else if (isUp) { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskHot(communityId, + askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, UrlFilterUtils.getFilterQuery("action", "up", "sequence_id", sequenceId)); } else { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskHot(communityId, + askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, UrlFilterUtils.getFilterQuery("action", "down", "sequence_id", sequenceId)); } @@ -89,13 +120,7 @@ public class AskQuestionsHotViewModel extends ListViewModel getRefreshCount() { + return mRefreshCount; + } + @Override public Observable> provideDataObservable(int page) { return null; } + + public MutableLiveData> getSubjectLiveData() { + return mSubjectLiveData; + } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskSubjectPageAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/AskSubjectPageAdapter.java new file mode 100644 index 0000000000..0c1de40a1f --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/AskSubjectPageAdapter.java @@ -0,0 +1,56 @@ +package com.gh.gamecenter.ask; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.gamecenter.NormalActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.RecyclingPagerAdapter; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.ask.subject.AskSubjectFragment; +import com.gh.gamecenter.databinding.AskRecommendsSubjectItemBinding; + +import java.util.List; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectPageAdapter extends RecyclingPagerAdapter { + + private Context mContext; + + private List mEntityList; + + public AskSubjectPageAdapter(Context context, List entityList) { + mContext = context; + mEntityList = entityList; + } + + @Override + public View getView(int position, View convertView, ViewGroup container) { + AskRecommendsSubjectItemBinding binding; + if (convertView != null) { + binding = DataBindingUtil.bind(convertView); + } else { + binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.ask_recommends_subject_item, null, false); + } + AskSubjectEntity entity = mEntityList.get(position % mEntityList.size()); + binding.setEntity(entity); + binding.getRoot().setOnClickListener(v -> { + Bundle bundle = new Bundle(); + bundle.putParcelable(AskSubjectEntity.TAG, entity); + NormalActivity.startFragment(mContext, AskSubjectFragment.class, bundle); + }); + return binding.getRoot(); + } + + @Override + public int getCount() { + return Integer.MAX_VALUE; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskSubjectViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/AskSubjectViewHolder.java new file mode 100644 index 0000000000..fd62d67c7b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/AskSubjectViewHolder.java @@ -0,0 +1,27 @@ +package com.gh.gamecenter.ask; + +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.ProgressBar; + +import com.gh.base.BaseRecyclerViewHolder; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; + +import butterknife.BindView; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectViewHolder extends BaseRecyclerViewHolder { + + @BindView(R.id.ask_recommends_subject_vp) + ViewPager mSubjectViewPager; + @BindView(R.id.ask_recommends_subject_pb) + ProgressBar mSubjectProgress; + + public AskSubjectViewHolder(View view) { + super(view); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java index d0b74908d8..8921eb992a 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java @@ -28,7 +28,6 @@ import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.db.info.InstallInfo; import com.gh.gamecenter.entity.InstallGameEntity; import com.gh.gamecenter.manager.UserManager; -import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.halo.assistant.HaloApp; @@ -205,23 +204,10 @@ public class SelectGameFragment extends ListFragment() { @Override - public void onResponse(JSONObject response) { - if (response == null) { - toast("提交失败,请检查网络状态"); - return; - } - try { - if ("ok".equals(response.getString("status"))) { - - toast("提交成功"); - } else { - toast("提交失败,请稍后尝试!"); - } - } catch (JSONException e) { - e.printStackTrace(); - } + public void onResponse(ResponseBody response) { + toast("提交成功"); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/AskSubjectEntity.java b/app/src/main/java/com/gh/gamecenter/ask/entity/AskSubjectEntity.java new file mode 100644 index 0000000000..07a1208bde --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/AskSubjectEntity.java @@ -0,0 +1,105 @@ +package com.gh.gamecenter.ask.entity; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectEntity implements Parcelable { + + public final static String TAG = "AskSubjectEntity"; + + @SerializedName("_id") + private String id; + + private String icon; + + private String title; + + private String description; + + private List tags; + + public AskSubjectEntity() { + } + + protected AskSubjectEntity(Parcel in) { + id = in.readString(); + icon = in.readString(); + title = in.readString(); + description = in.readString(); + tags = in.createStringArrayList(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AskSubjectEntity createFromParcel(Parcel in) { + return new AskSubjectEntity(in); + } + + @Override + public AskSubjectEntity[] newArray(int size) { + return new AskSubjectEntity[size]; + } + }; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(id); + dest.writeString(icon); + dest.writeString(title); + dest.writeString(description); + dest.writeStringList(tags); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java index f44608e7a8..d899edda50 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java @@ -41,7 +41,7 @@ class MyAnswerAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mEntityList, mListClickListener); + return new AnswerViewHolder(view, mListClickListener); default: return null; } diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java index 996052c594..7896120018 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java @@ -50,7 +50,7 @@ public class MyAnswerFragment extends ListFragment entityList; + AnswerEntity entity; String tracers = mEntrance + "+(我的回答)"; Bundle bundle; switch (view.getId()) { @@ -60,8 +60,8 @@ public class MyAnswerFragment extends ListFragment) data; - Questions questions = entityList.get(position).getQuestions(); + entity = (AnswerEntity) data; + Questions questions = entity.getQuestions(); bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questions.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, tracers); @@ -69,9 +69,9 @@ public class MyAnswerFragment extends ListFragment) data; + entity = (AnswerEntity) data; bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_ANSWER_ID, entityList.get(position).getId()); + bundle.putString(EntranceUtils.KEY_ANSWER_ID, entity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, tracers); NormalActivity.startFragment(getContext(), AnswerDetailFragment.class, bundle); break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java index 4777f3441b..0b389fe367 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java @@ -41,7 +41,7 @@ class MyDraftAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mEntityList, mListClickListener); + return new AnswerViewHolder(view, mListClickListener); default: return null; } diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java index 98de0d509e..fbfcc4a18c 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java @@ -80,7 +80,7 @@ public class MyDraftFragment extends ListFragment) data).get(position); + entity = (AnswerEntity) data; bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, entity.getQuestions().getTitle()); bundle.putString(EntranceUtils.KEY_ANSWER_CONTENT, entity.getBrief()); @@ -89,7 +89,7 @@ public class MyDraftFragment extends ListFragment) data).get(position); + entity = (AnswerEntity) data; Questions questions = entity.getQuestions(); bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questions.getId()); diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java index 3662d179ce..f0f9eb9395 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java @@ -41,7 +41,7 @@ public class AnswerFoldAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mEntityList, mListClickListener); + return new AnswerViewHolder(view, mListClickListener); default: return null; } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java index 92d83ab772..91b4d6a86b 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java @@ -91,8 +91,7 @@ public class AnswerFoldFragment extends ListFragment entityList = (List) data; - AnswerEntity entity = entityList.get(position); + AnswerEntity entity = (AnswerEntity) data; Bundle bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_ANSWER_ID, entity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, mEntrance + "+(折叠回答)"); diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java index 71a5101cb0..447347b561 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java @@ -22,7 +22,7 @@ import butterknife.BindView; * Created by khy on 19/12/17. */ -public class AnswerViewHolder extends BaseRecyclerViewHolder { +public class AnswerViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.ask_answer_item_usericon) SimpleDraweeView mUsericon; @@ -39,13 +39,14 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.ask_answer_item_community_name) TextView mCommunityName; - public AnswerViewHolder(View itemView, Object data, OnListClickListener listClickListener) { - super(itemView, data, listClickListener); + public AnswerViewHolder(View itemView, OnListClickListener listClickListener) { + super(itemView, listClickListener); itemView.setOnClickListener(this); mQuestionTitle.setOnClickListener(this); } public void initAnswerViewHolder(Context context, AnswerEntity entity) { + setClickData(entity); mContent.setText(entity.getBrief()); mVotecount.setText(context.getString(R.string.ask_vote_count, AskUtils.voteCountFormat(entity.getVote()))); UserEntity user = entity.getUser(); @@ -61,6 +62,7 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { } public void initCollectionAnswerViewHolder(AnswerEntity entity) { + setClickData(entity); mQuestionTitle.setVisibility(View.VISIBLE); mQuestionTitle.setText(entity.getQuestions().getTitle()); mContent.setText(entity.getBrief()); @@ -80,6 +82,7 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { } public void initMyAnswerViewHolder(AnswerEntity entity) { + setClickData(entity); mUsername.setVisibility(View.GONE); mUsericon.setVisibility(View.GONE); mQuestionTitle.setVisibility(View.VISIBLE); @@ -98,6 +101,7 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { } public void initMyDraftViewHolder(AnswerEntity entity) { + setClickData(entity); mUsername.setVisibility(View.GONE); mUsericon.setVisibility(View.GONE); mQuestionTitle.setVisibility(View.VISIBLE); 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 05917798be..74c11847ea 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 @@ -123,7 +123,7 @@ public class QuestionsDetailAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mEntityList, mListClickListener); + return new AnswerViewHolder(view, mListClickListener); default: return null; } 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 448d06100a..24770d53fa 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 @@ -195,8 +195,8 @@ public class QuestionsDetailFragment extends ListFragment entityList = (List) data; - AnswerEntity entity = entityList.get(position - ListAdapter.TOP_ITEM_COUNT); + + AnswerEntity entity = (AnswerEntity) data; Bundle bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_ANSWER_ID, entity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, mEntrance + "+(问题详情)"); diff --git a/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectAdapter.java new file mode 100644 index 0000000000..b1d99b4927 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectAdapter.java @@ -0,0 +1,103 @@ +package com.gh.gamecenter.ask.subject; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +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.AnswerEntity; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.ask.questionsdetail.AnswerViewHolder; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.databinding.AskSubjectTopItemBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectAdapter extends ListAdapter { + + private OnListClickListener mListClickListener; + + private AskSubjectEntity mSubjectEntity; + + public AskSubjectAdapter(Context context, OnListClickListener listClickListener) { + super(context); + mListClickListener = listClickListener; + } + + @Override + protected void setListData(List updateData) { + int oldSize = mEntityList == null ? 0 : mEntityList.size() + TOP_ITEM_COUNT; + mEntityList = new ArrayList<>(updateData); + if (oldSize == 0 || oldSize > updateData.size()) { + notifyDataSetChanged(); + } else { + notifyItemRangeInserted(oldSize, updateData.size() - oldSize); + } + } + + public void setSubjectEntity(AskSubjectEntity subjectEntity) { + mSubjectEntity = subjectEntity; + notifyDataSetChanged(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_TOP: + view = mLayoutInflater.inflate(R.layout.ask_subject_top_item, parent, false); + AskSubjectTopItemBinding binding = DataBindingUtil.bind(view); + return new AskSubjectViewHolder(binding, mListClickListener); + case ItemViewType.ITEM_FOOTER: + 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); + } + return null; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_TOP: + AskSubjectViewHolder subjectViewHolder = (AskSubjectViewHolder) holder; + subjectViewHolder.mBinding.setEntity(mSubjectEntity); + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + case ItemViewType.ITEM_BODY: + int index = position - ListAdapter.TOP_ITEM_COUNT; + if (index != -1) + ((AnswerViewHolder) holder).initAnswerViewHolder(mContext, mEntityList.get(index)); + break; + } + } + + @Override + public int getItemViewType(int position) { + if (position == 0) return ItemViewType.ITEM_TOP; + if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public int getItemCount() { + if (mSubjectEntity == null) return 0; + return mEntityList == null ? TOP_ITEM_COUNT + FOOTER_ITEM_COUNT : mEntityList.size() + FOOTER_ITEM_COUNT + TOP_ITEM_COUNT; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectFragment.java b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectFragment.java new file mode 100644 index 0000000000..b5c73e4f9c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectFragment.java @@ -0,0 +1,96 @@ +package com.gh.gamecenter.ask.subject; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.gh.common.util.EntranceUtils; +import com.gh.common.view.VerticalItemDecoration; +import com.gh.gamecenter.NormalActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.AnswerDetailFragment; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.baselist.LoadStatus; +import com.gh.gamecenter.baselist.LoadType; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectFragment extends ListFragment { + + private AskSubjectAdapter mAdapter; + + @Override + protected RecyclerView.ItemDecoration getItemDecoration() { + return new VerticalItemDecoration(getContext(), 8, false); + } + + @Override + protected boolean isAutomaticLoad() { + return false; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setNavigationTitle("专题详情"); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle arguments = getArguments(); + if (arguments != null) { + AskSubjectEntity entity = arguments.getParcelable(AskSubjectEntity.TAG); + mListViewModel.setSubjectLiveData(entity); + } + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mListViewModel.getSubjectLiveData().observe(this, subjectEntity -> mAdapter.setSubjectEntity(subjectEntity)); + } + + @Override + protected ListAdapter provideListAdapter() { + return mAdapter == null ? mAdapter = new AskSubjectAdapter(getContext(), this) : mAdapter; + } + + @Override + public void onLoadEmpty() { + super.onLoadDone(); + mAdapter.loadChange(LoadStatus.LIST_OVER); + } + + @Override + public void onLoadError() { + super.onLoadDone(); + mAdapter.loadChange(LoadStatus.LIST_FAILED); + } + + @Override + public void onListClick(View view, int position, Object data) { + switch (view.getId()) { + case R.id.footerview_item: + if (mAdapter.isNetworkError()) { + mListViewModel.load(LoadType.RETRY); + } + break; + case R.id.ask_answer_item_constraintlayout: + AnswerEntity answerEntity = (AnswerEntity) data; + Bundle bundle = new Bundle(); + bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerEntity.getId()); + bundle.putString(EntranceUtils.KEY_ENTRANCE, "(社区专题)"); + NormalActivity.startFragment(getContext(), AnswerDetailFragment.class, bundle); + break; + } + + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewHolder.java new file mode 100644 index 0000000000..41167e8e26 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewHolder.java @@ -0,0 +1,20 @@ +package com.gh.gamecenter.ask.subject; + +import com.gh.base.BaseRecyclerViewHolder; +import com.gh.base.OnListClickListener; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.databinding.AskSubjectTopItemBinding; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectViewHolder extends BaseRecyclerViewHolder { + + AskSubjectTopItemBinding mBinding; + + public AskSubjectViewHolder(AskSubjectTopItemBinding binding, OnListClickListener listClickListener) { + super(binding.getRoot(), listClickListener); + mBinding = binding; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewModel.java b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewModel.java new file mode 100644 index 0000000000..7d54a66a6b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/subject/AskSubjectViewModel.java @@ -0,0 +1,49 @@ +package com.gh.gamecenter.ask.subject; + +import android.app.Application; +import android.arch.lifecycle.MediatorLiveData; +import android.arch.lifecycle.MutableLiveData; +import android.support.annotation.NonNull; + +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.ask.entity.AskSubjectEntity; +import com.gh.gamecenter.baselist.ListViewModel; +import com.gh.gamecenter.baselist.LoadType; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 1/04/18. + */ + +public class AskSubjectViewModel extends ListViewModel { + MutableLiveData mSubjectLiveData = new MediatorLiveData<>(); + + public AskSubjectViewModel(@NonNull Application application) { + super(application); + mResultLiveData.addSource(mListLiveData, mResultLiveData::postValue); + mResultLiveData.addSource(mSubjectLiveData, askSubjectEntity -> { + mResultLiveData.removeSource(mSubjectLiveData); + load(LoadType.NORMAL); + }); + } + + public MutableLiveData getSubjectLiveData() { + return mSubjectLiveData; + } + + public void setSubjectLiveData(AskSubjectEntity subjectLiveData) { + if (subjectLiveData != null) mSubjectLiveData.postValue(subjectLiveData); + } + + @Override + public Observable> provideDataObservable(int page) { + if (mSubjectLiveData.getValue() == null) return null; + return RetrofitManager.getInstance(getApplication()).getApi() + .getAskSubjectColumnAnswers(UserManager.getInstance().getCommunityId(getApplication()), mSubjectLiveData.getValue().getId()); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java b/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java index bcc042b530..8a844f47af 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/LoadStatus.java @@ -22,9 +22,4 @@ public enum LoadStatus { LIST_LOADED, LIST_FAILED, LIST_OVER, - - // 推荐数据流相关 - REFRESH_FAILED, - REFRESH_OVER, - REFRESH_LOADED } \ No newline at end of file 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 92663637c0..de075c630e 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java @@ -41,7 +41,7 @@ public class AnswerAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); - return new AnswerViewHolder(view, mEntityList, mListClickListener); + return new AnswerViewHolder(view, mListClickListener); default: return null; } 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 52a81da110..53a97924ee 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java @@ -42,7 +42,7 @@ public class AnswerFragment extends ListFragment entityList; + AnswerEntity entity; String tracers; switch (view.getId()) { case R.id.footerview_item: @@ -51,8 +51,7 @@ public class AnswerFragment extends ListFragment) data; - AnswerEntity entity = entityList.get(position); + entity = (AnswerEntity) data; Bundle bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_ANSWER_ID, entity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, mEntrance + "+(回答)"); @@ -60,8 +59,8 @@ public class AnswerFragment extends ListFragment) data; - Questions questions = entityList.get(position).getQuestions(); + entity = (AnswerEntity) data; + Questions questions = entity.getQuestions(); bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questions.getId()); @@ -71,9 +70,9 @@ public class AnswerFragment extends ListFragment) data; + entity = (AnswerEntity) data; bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_ANSWER_ID, entityList.get(position).getId()); + bundle.putString(EntranceUtils.KEY_ANSWER_ID, entity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, tracers); NormalActivity.startFragment(getContext(), AnswerDetailFragment.class, bundle); break; diff --git a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java index 8e7c4261c8..9e2f44ec13 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java @@ -6,7 +6,6 @@ import android.arch.lifecycle.ViewModelProviders; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -63,28 +62,25 @@ public class LoginFragment extends NormalFragment implements LoginUtils.onCaptch private String mServiceId; - Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - if (msg.what == 0) { // 验证码倒计时 - int arg1 = msg.arg1; - arg1--; - if (arg1 >= 0) { - Message message = new Message(); - message.what = 0; - message.arg1 = arg1; - mHandler.sendMessageDelayed(message, 1000); - mLoginCaptcha.setText(arg1 + "s"); - } else { - mLoginCaptcha.setText("重新获取"); - mLoginCaptcha.setTextColor(ContextCompat.getColor(getContext(), R.color.title)); - mLoginCaptcha.setBackgroundResource(R.drawable.border_black_bg); - mLoginCaptcha.setEnabled(true); - } + @Override + protected void handleMessage(Message msg) { + if (msg.what == 0) { // 验证码倒计时 + int arg1 = msg.arg1; + arg1--; + if (arg1 >= 0) { + Message message = new Message(); + message.what = 0; + message.arg1 = arg1; + mBaseHandler.sendMessageDelayed(message, 1000); + mLoginCaptcha.setText(arg1 + "s"); + } else { + mLoginCaptcha.setText("重新获取"); + mLoginCaptcha.setTextColor(ContextCompat.getColor(getContext(), R.color.title)); + mLoginCaptcha.setBackgroundResource(R.drawable.border_black_bg); + mLoginCaptcha.setEnabled(true); } } - }; + } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -186,7 +182,7 @@ public class LoginFragment extends NormalFragment implements LoginUtils.onCaptch Message message = new Message(); message.what = 0; message.arg1 = 60; // 倒数时间 - mHandler.sendMessage(message); + mBaseHandler.sendMessage(message); mLoginCaptcha.setTextColor(ContextCompat.getColor(getContext(), R.color.hint)); mLoginCaptcha.setBackgroundResource(R.drawable.border_captcha_bg); mLoginCaptcha.setEnabled(false); @@ -213,7 +209,7 @@ public class LoginFragment extends NormalFragment implements LoginUtils.onCaptch @Override public void onDestroyView() { super.onDestroyView(); - mHandler.removeCallbacksAndMessages(null); + mBaseHandler.removeCallbacksAndMessages(null); } diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageNormalFragment.java b/app/src/main/java/com/gh/gamecenter/message/MessageNormalFragment.java index 7cc5de9eb9..e27f84ba8e 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageNormalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageNormalFragment.java @@ -9,6 +9,7 @@ import android.view.View; import com.gh.common.util.AskLogUtils; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.CommentDetailActivity; +import com.gh.gamecenter.MessageDetailActivity; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; @@ -96,19 +97,20 @@ public class MessageNormalFragment extends ListFragment> getAskHot(@Path("community_id") String communityId, @Query("filter") String filter); + Observable> getAskRecommends(@Path("community_id") String communityId, @Query("filter") String filter); /** * 获取社区首页-问题列表 @@ -893,6 +894,18 @@ public interface ApiService { @GET("users/{user_id}/favorites/answers") Observable> getCollectionAnswer(@Path("user_id") String user_id, @Query("page") int page); + /** + * 专题数据 + */ + @GET("communities/{community_id}/columns") + Observable> getAskSubjectColumn(@Path("community_id") String communityId); + + /** + * 社区专题的答案 + */ + @GET("communities/{community_id}/columns/{column_id}/answers") + Observable> getAskSubjectColumnAnswers(@Path("community_id") String communityId, @Path("column_id") String columnId); + // /** // * 获取默认社区 // */ diff --git a/app/src/main/res/drawable-xhdpi/message_image_placeholder.png b/app/src/main/res/drawable-xhdpi/message_image_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bf8079334d89fd5c812db0a0ff8d3932780ee9 GIT binary patch literal 14833 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 + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ask_recommends_subject.xml b/app/src/main/res/layout/ask_recommends_subject.xml new file mode 100644 index 0000000000..0374d9f594 --- /dev/null +++ b/app/src/main/res/layout/ask_recommends_subject.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ask_recommends_subject_item.xml b/app/src/main/res/layout/ask_recommends_subject_item.xml new file mode 100644 index 0000000000..20c78511d0 --- /dev/null +++ b/app/src/main/res/layout/ask_recommends_subject_item.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ask_subject_top_item.xml b/app/src/main/res/layout/ask_subject_top_item.xml new file mode 100644 index 0000000000..8d17cf3105 --- /dev/null +++ b/app/src/main/res/layout/ask_subject_top_item.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/message_item.xml b/app/src/main/res/layout/message_item.xml index 4c7603ebfb..488d3ab5a8 100644 --- a/app/src/main/res/layout/message_item.xml +++ b/app/src/main/res/layout/message_item.xml @@ -10,7 +10,7 @@ + android:layout_centerVertical = "true" + app:fadeDuration = "500" + app:placeholderImage = "@drawable/message_image_placeholder" + app:placeholderImageScaleType = "fitXY" />