整理社区搜索相关页面

This commit is contained in:
kehaoyuan
2018-08-20 18:08:47 +08:00
parent 6bdd021856
commit 9b6e29d5f2
10 changed files with 79 additions and 161 deletions

View File

@ -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<LD> {
private final static int REQUEST_FAILURE_SIZE = -100;
private MutableLiveData<List<LD>> mResultLiveData = new MutableLiveData<>();
private MutableLiveData<LoadStatus> 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<List<LD>> 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<List<LD>>() {
@Override
public void onResponse(List<LD> response) {
loadStatusControl(response.size());
// if (response.size() == 0) return; // 不需要添加 页面由LoadStatus控制刷新
List<LD> 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<List<LD>> getResultLiveData() {
return mResultLiveData;
}
public LiveData<LoadStatus> getLoadStatusLiveData() {
return mLoadStatusLiveData;
}
}

View File

@ -31,10 +31,13 @@ public abstract class ListViewModel<LD /*ListData*/, ID /*ItemData*/> 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<LD /*ListData*/, ID /*ItemData*/> 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<LD /*ListData*/, ID /*ItemData*/> extends Ba
mLoadStatusLiveData.setValue(LoadStatus.INIT);
}
public void setOverLimitSize(int overLimitSize) {
mOverLimitSize = overLimitSize;
}
@Override
public void load(LoadType loadType) {
if (loadType == LoadType.REFRESH) {

View File

@ -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<Any>(binding.root)
class AskSearchQuestionItemViewHolder(val binding: AskSearchQuestionItemBinding) : BaseRecyclerViewHolder<Any>(binding.root)

View File

@ -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<T>(context: Context) : ListAdapter<T>(context) {
private var mSearchKey = ""
public override fun setListData(listData: List<T>?) {
if (listData == null) {
if (mEntityList != null) mEntityList.clear()
} else {
mEntityList = ArrayList(listData)
}
notifyDataSetChanged()
public override fun setListData(updateData: List<T>?) {
super.setListData(updateData)
}
protected fun replayKeyword(title: String?): String? {

View File

@ -35,13 +35,13 @@ class HottestFragment : BaseAskSearchFragment<AskSearchEntity, NormalListViewMod
return if (TextUtils.isEmpty(mSearchKey)) null
else if (!questionTag.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag), "answer_vote", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag), "answer_vote:-1", page)
} else if (!columnId.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId), "answer_vote", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId), "answer_vote:-1", page)
} else {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey), "answer_vote", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey), "answer_vote:-1", page)
}
}
}

View File

@ -35,11 +35,11 @@ class NewestFragment : BaseAskSearchFragment<AskSearchEntity, NormalListViewMode
return if (TextUtils.isEmpty(mSearchKey)) null
else if (!questionTag.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag), "answer_time", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag), "answer_time:-1", page)
} else if (!columnId.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId), "answer_time", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId), "answer_time:-1", page)
} else api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey), "answer_time", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey), "answer_time:-1", page)
}
}

View File

@ -16,6 +16,10 @@ import com.gh.gamecenter.qa.search.base.BaseAskSearchAdapter
class QuestionAdapter(context: Context) : BaseAskSearchAdapter<AskSearchEntity>(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<AskSearchEntity>(
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<AskSearchEntity>(
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

View File

@ -35,11 +35,11 @@ class QuestionFragment : BaseAskSearchFragment<AskSearchEntity, NormalListViewMo
return if (TextUtils.isEmpty(mSearchKey)) null
else if (!questionTag.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag, "type", "question"), "question_time", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "question_tag", questionTag, "type", "question"), "question_time:-1", page)
} else if (!columnId.isNullOrEmpty()) {
api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId, "type", "question"), "question_time", page)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "column_id", columnId, "type", "question"), "question_time:-1", page)
} else api.getAskSearch(UserManager.getInstance().community.id,
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "type", "question"), "question_time", 1)
UrlFilterUtils.getFilterQuery("keyword", mSearchKey, "type", "question"), "question_time:-1", page)
}
}

View File

@ -34,6 +34,11 @@ class OpenedFragment : ListFragment<AskGameSelectEntity, OpenedViewModel>() {
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)