整理社区搜索相关页面
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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) {
|
||||
|
||||
@ -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)
|
||||
@ -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? {
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user