From 9b6e29d5f2dfcedf34483189403776ffc8180fb2 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Mon, 20 Aug 2018 18:08:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=A4=BE=E5=8C=BA=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=9B=B8=E5=85=B3=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/baselist/ListRepository.java | 137 ------------------ .../gh/gamecenter/baselist/ListViewModel.java | 9 +- .../search/AskSearchQuestionItemViewHolder.kt | 4 +- .../qa/search/base/BaseAskSearchAdapter.kt | 10 +- .../qa/search/hottest/HottestFragment.kt | 6 +- .../qa/search/newest/NewestFragment.kt | 6 +- .../qa/search/question/QuestionAdapter.kt | 11 +- .../qa/search/question/QuestionFragment.kt | 6 +- .../gh/gamecenter/qa/select/OpenedFragment.kt | 5 + .../res/layout/ask_search_question_item.xml | 46 ++++++ 10 files changed, 79 insertions(+), 161 deletions(-) delete mode 100644 app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java create mode 100644 app/src/main/res/layout/ask_search_question_item.xml diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java b/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java deleted file mode 100644 index 0848051c7a..0000000000 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListRepository.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.gh.gamecenter.baselist; - -import android.arch.lifecycle.LiveData; -import android.arch.lifecycle.MutableLiveData; -import android.support.annotation.MainThread; - -import com.gh.gamecenter.retrofit.Response; - -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import retrofit2.HttpException; - -/** - * Created by khy on 2/12/17. - */ - -public class ListRepository { - - private final static int REQUEST_FAILURE_SIZE = -100; - - private MutableLiveData> mResultLiveData = new MutableLiveData<>(); - private MutableLiveData mLoadStatusLiveData = new MutableLiveData<>(); - - private OnDataObservable mDataObservable; - - private LoadParams mRetryParams; - private LoadParams mCurLoadParams; - - - public ListRepository(OnDataObservable onDataObservable) { - mDataObservable = onDataObservable; - initLoadParams(); - } - - private void loadData() { - if (mCurLoadParams == null) initLoadParams(); - - LoadParams loadParams = mRetryParams != null ? mRetryParams : mCurLoadParams; - Observable> listObservable = mDataObservable.provideDataObservable(loadParams.getLoadOffset()); - LoadStatus curStatus = mLoadStatusLiveData.getValue(); - - if (listObservable == null || curStatus != null && - curStatus != LoadStatus.INIT_LOADED && - curStatus != LoadStatus.LIST_LOADED && - curStatus != LoadStatus.INIT) return; - - if (mCurLoadParams.getLoadOffset() == LoadParams.DEFAULT_OFFSET) { - mLoadStatusLiveData.postValue(LoadStatus.INIT_LOADING); - } else { - mLoadStatusLiveData.postValue(LoadStatus.LIST_LOADING); - } - - listObservable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { - @Override - public void onResponse(List response) { - loadStatusControl(response.size()); - -// if (response.size() == 0) return; // 不需要添加 页面由LoadStatus控制刷新 - - List previousData = mResultLiveData.getValue(); - if (previousData == null || curStatus == LoadStatus.INIT) { - previousData = new ArrayList<>(); - } - previousData.addAll(response); - mResultLiveData.postValue(previousData); - } - - @Override - public void onFailure(HttpException e) { - if (e != null && e.code() == 404) { - loadStatusControl(0); - } else { - loadStatusControl(REQUEST_FAILURE_SIZE); - } - } - }); - } - - private void loadStatusControl(int size) { - if (mCurLoadParams.getLoadOffset() == LoadParams.DEFAULT_OFFSET) { // 初始化列表 - if (size == 0) { - mLoadStatusLiveData.postValue(LoadStatus.INIT_EMPTY); - } else if (size == REQUEST_FAILURE_SIZE) { - mLoadStatusLiveData.postValue(LoadStatus.INIT_FAILED); - } else if (size < mCurLoadParams.getLoadSize() / 2) { // 避免一个屏幕出现两次分页 - mLoadStatusLiveData.postValue(LoadStatus.INIT_OVER); - } else { - mLoadStatusLiveData.postValue(LoadStatus.INIT_LOADED); - } - } else { - if (size == REQUEST_FAILURE_SIZE) { - mLoadStatusLiveData.postValue(LoadStatus.LIST_FAILED); - } else if (size == 0) { - mLoadStatusLiveData.postValue(LoadStatus.LIST_OVER); - } else { - mLoadStatusLiveData.postValue(LoadStatus.LIST_LOADED); - } - } - - if (size == REQUEST_FAILURE_SIZE) { - mRetryParams = mCurLoadParams; - } else { - mRetryParams = null; - mCurLoadParams.setLoadOffset(mCurLoadParams.getLoadOffset() + 1); // 页数 + 1 - } - } - - private void initLoadParams() { - mCurLoadParams = new LoadParams(LoadParams.DEFAULT_OFFSET); - mLoadStatusLiveData.setValue(LoadStatus.INIT); - } - - @MainThread - protected void load(LoadType loadType) { - if (loadType == LoadType.REFRESH) { - initLoadParams(); - } else if (loadType == LoadType.RETRY) { - mLoadStatusLiveData.setValue(LoadStatus.LIST_LOADED); - } - loadData(); - } - - public LiveData> getResultLiveData() { - return mResultLiveData; - } - - public LiveData getLoadStatusLiveData() { - return mLoadStatusLiveData; - } -} diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java b/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java index 44389ff208..582664bcdc 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListViewModel.java @@ -31,10 +31,13 @@ public abstract class ListViewModel extends Ba private LoadParams mRetryParams; private LoadParams mCurLoadParams; + private int mOverLimitSize; + public ListViewModel(@NonNull Application application) { super(application); mergeResultLiveData(); initLoadParams(); + mOverLimitSize = mCurLoadParams.getLoadSize() / 2; } private void loadData() { @@ -99,7 +102,7 @@ public abstract class ListViewModel extends Ba mLoadStatusLiveData.postValue(LoadStatus.INIT_EMPTY); } else if (size == REQUEST_FAILURE_SIZE) { mLoadStatusLiveData.postValue(LoadStatus.INIT_FAILED); - } else if (size < mCurLoadParams.getLoadSize() / 2) { // 避免一个屏幕出现两次分页 + } else if (size < mOverLimitSize) { // 避免一个屏幕出现两次分页 mLoadStatusLiveData.postValue(LoadStatus.INIT_OVER); } else { mLoadStatusLiveData.postValue(LoadStatus.INIT_LOADED); @@ -127,6 +130,10 @@ public abstract class ListViewModel extends Ba mLoadStatusLiveData.setValue(LoadStatus.INIT); } + public void setOverLimitSize(int overLimitSize) { + mOverLimitSize = overLimitSize; + } + @Override public void load(LoadType loadType) { if (loadType == LoadType.REFRESH) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/AskSearchQuestionItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/search/AskSearchQuestionItemViewHolder.kt index 3031d8b802..1f6e6b6347 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/AskSearchQuestionItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/AskSearchQuestionItemViewHolder.kt @@ -1,6 +1,6 @@ package com.gh.gamecenter.qa.search import com.gh.base.BaseRecyclerViewHolder -import com.gh.gamecenter.databinding.QuestionEditTitleSearchItemBinding +import com.gh.gamecenter.databinding.AskSearchQuestionItemBinding -class AskSearchQuestionItemViewHolder(val binding: QuestionEditTitleSearchItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file +class AskSearchQuestionItemViewHolder(val binding: AskSearchQuestionItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt index 940e2a228d..88a6fb3358 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt @@ -9,19 +9,13 @@ import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.gh.gamecenter.qa.search.AskSearchActivity -import java.util.* abstract class BaseAskSearchAdapter(context: Context) : ListAdapter(context) { private var mSearchKey = "" - public override fun setListData(listData: List?) { - if (listData == null) { - if (mEntityList != null) mEntityList.clear() - } else { - mEntityList = ArrayList(listData) - } - notifyDataSetChanged() + public override fun setListData(updateData: List?) { + super.setListData(updateData) } protected fun replayKeyword(title: String?): String? { diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestFragment.kt index 81dcb6c7f4..8908beee32 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestFragment.kt @@ -35,13 +35,13 @@ class HottestFragment : BaseAskSearchFragment(context) { + override fun areItemsTheSame(oldItem: AskSearchEntity?, newItem: AskSearchEntity?): Boolean { + return oldItem?.id == newItem?.id + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view: View return when (viewType) { @@ -24,7 +28,7 @@ class QuestionAdapter(context: Context) : BaseAskSearchAdapter( FooterViewHolder(view) } else -> { - view = mLayoutInflater.inflate(R.layout.question_edit_title_search_item, parent, false) + view = mLayoutInflater.inflate(R.layout.ask_search_question_item, parent, false) AskSearchQuestionItemViewHolder(DataBindingUtil.bind(view)!!) } } @@ -35,9 +39,8 @@ class QuestionAdapter(context: Context) : BaseAskSearchAdapter( ItemViewType.ITEM_BODY -> { val viewHolder = holder as AskSearchQuestionItemViewHolder val entity = mEntityList[position] - viewHolder.binding.questionsEditIndexTitle.text = Html.fromHtml(replayKeyword(entity.questions.title)) - viewHolder.binding.questionsEditIndexAnswerCount.text = (entity.questions.answerCount.toString() + " 回答") - viewHolder.binding.questionsEditIndexLine.visibility = View.INVISIBLE + viewHolder.binding.questionsTitle.text = Html.fromHtml(replayKeyword(entity.questions.title)) + viewHolder.binding.questionsAnswerCount.text = (entity.questions.answerCount.toString() + " 回答") viewHolder.itemView.setOnClickListener { val questions = Questions() questions.id = entity.questions.id diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionFragment.kt index 6348ca0062..9d3aee2adb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionFragment.kt @@ -35,11 +35,11 @@ class QuestionFragment : BaseAskSearchFragment() { return mAdapter!! } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mListViewModel?.setOverLimitSize(16) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mGridLayoutManager = GridLayoutManager(context, 2) diff --git a/app/src/main/res/layout/ask_search_question_item.xml b/app/src/main/res/layout/ask_search_question_item.xml new file mode 100644 index 0000000000..79f47668f5 --- /dev/null +++ b/app/src/main/res/layout/ask_search_question_item.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file