问题编辑改造-标题搜索提示初步完成

This commit is contained in:
kehaoyuan
2018-05-05 18:41:13 +08:00
parent 50209aa6ed
commit da433bfb5b
5 changed files with 144 additions and 66 deletions

View File

@ -6,6 +6,7 @@ import android.arch.lifecycle.ViewModelProviders
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.Message
import android.provider.MediaStore
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
@ -13,17 +14,21 @@ import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.view.MenuItem
import android.widget.AbsListView
import android.widget.AbsListView.OnScrollListener.SCROLL_STATE_IDLE
import android.widget.EditText
import android.widget.ListPopupWindow
import com.gh.base.fragment.BaseDialogWrapperFragment
import com.gh.base.fragment.WaitingDialogFragment
import com.gh.common.util.DisplayUtils
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.SuggestionActivity.MEDIA_STORE_REQUEST
import com.gh.gamecenter.ask.entity.QuestionsDetailEntity
import com.gh.gamecenter.ask.entity.QuestionsIndexEntity
import com.gh.gamecenter.ask.questionsedit.QuestionsEditViewModel
import com.gh.gamecenter.ask.questionsedit.TagsSelectFragment
import com.gh.gamecenter.ask.questionsedit.pic.QuestionsEditPicAdapter
import com.gh.gamecenter.ask.questionsedit.tip.QuestionTitleTipAdapter
import com.gh.gamecenter.ask.questionsedit.tip.QuestionTitleTipEditView
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.mvvm.Resource
import com.gh.gamecenter.mvvm.Status
@ -38,7 +43,7 @@ class QuestionsEditActivity : NormalActivity() {
private var mViewModel: QuestionsEditViewModel? = null
val mTitle by bindView<QuestionTitleTipEditView>(R.id.questionsedit_title)
val mTitle by bindView<EditText>(R.id.questionsedit_title)
val mContent by bindView<EditText>(R.id.questionsedit_content)
val mPicRv by bindView<RecyclerView>(R.id.suggest_pic_rv)
@ -51,6 +56,9 @@ class QuestionsEditActivity : NormalActivity() {
private var mSearchKey: String? = null
private var listPopupWindow: ListPopupWindow? = null
private var mTitleTipAdapter: QuestionTitleTipAdapter? = null
companion object {
// searchKey 补充到标题(新增问题)
fun getIntent(context: Context, searchKey: String?): Intent {
@ -73,6 +81,17 @@ class QuestionsEditActivity : NormalActivity() {
}
override fun handleMessage(msg: Message?) {
if (msg?.what == 1) {
val s = msg.obj as String?
if (!s.isNullOrEmpty()) {
mViewModel?.getTitleTipData(s!!)
} else if (listPopupWindow?.isShowing!!) {
listPopupWindow?.dismiss()
}
}
}
override fun getLayoutId(): Int {
return R.layout.activity_questions_edit
}
@ -138,6 +157,16 @@ class QuestionsEditActivity : NormalActivity() {
if (it != null) mPicAdapter?.notifyPicList(it)
})
mViewModel?.mTitleTipData?.observe(this, Observer { it ->
if (it != null && it.size > 0) {
mTitleTipAdapter?.setListData(it)
listPopupWindow?.show()
setPopuListScroll()
} else {
listPopupWindow?.dismiss()
}
})
initView()
}
@ -188,8 +217,6 @@ class QuestionsEditActivity : NormalActivity() {
}
}
val questionTitleAutoCompleteAdapter = QuestionTitleTipAdapter(applicationContext)
mTitle.setAdapter(questionTitleAutoCompleteAdapter)
mTitle.addTextChangedListener(LimitTextWatcher(mTitle))
mContent.addTextChangedListener(LimitTextWatcher(mContent))
mPicRv.layoutManager = object : GridLayoutManager(this, 5) {
@ -199,6 +226,33 @@ class QuestionsEditActivity : NormalActivity() {
}
mPicAdapter = QuestionsEditPicAdapter(this, mViewModel!!)
mPicRv.adapter = mPicAdapter
mTitleTipAdapter = QuestionTitleTipAdapter(applicationContext)
listPopupWindow = ListPopupWindow(this)
listPopupWindow?.anchorView = mTitle
listPopupWindow?.setAdapter(mTitleTipAdapter)
listPopupWindow?.height = DisplayUtils.dip2px(this, 200F)
listPopupWindow?.setOnItemClickListener({ _, _, position, _ ->
val entity = mTitleTipAdapter?.getItem(position) as QuestionsIndexEntity
val tracers = mEntrance + "+(标题自动搜索)"
startActivity(QuestionsDetailActivity.getIntent(this, entity.id, tracers))
})
}
private fun setPopuListScroll() {
var totalItemCount = 0
var lastVisibleItem = 0
listPopupWindow?.listView!!.setOnScrollListener(object : AbsListView.OnScrollListener {
override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {
if (totalItemCount == lastVisibleItem && scrollState == SCROLL_STATE_IDLE) {
mViewModel?.getTitleTipData(mTitle.text.toString())
}
}
override fun onScroll(view: AbsListView, firstVisibleItem: Int, visibleItemCount: Int, totalCount: Int) {
lastVisibleItem = firstVisibleItem + visibleItemCount
totalItemCount = totalCount
}
})
}
private inner class LimitTextWatcher(private val mEditText: EditText) : TextWatcher {
@ -218,6 +272,12 @@ class QuestionsEditActivity : NormalActivity() {
mTitle.setSelection(mTitle.text!!.length)
toast("标题最多50个字")
}
var message = Message()
message.obj = mTitle.text.toString()
message.what = 1
mBaseHandler.removeMessages(1)
mBaseHandler.sendMessageDelayed(message, 500)
} else if (mEditText === mContent) {
if (s.length > QUESTION_CONTENT_MAX_LENGTH) {
mContent.setText("")
@ -228,6 +288,7 @@ class QuestionsEditActivity : NormalActivity() {
}
}
}
override fun afterTextChanged(s: Editable) {}
}

View File

@ -5,12 +5,15 @@ import android.arch.lifecycle.AndroidViewModel
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MediatorLiveData
import android.arch.lifecycle.Transformations
import anet.channel.util.Utils.context
import com.gh.base.fragment.WaitingDialogFragment
import com.gh.common.util.GsonUtils
import com.gh.common.util.ImageUtils
import com.gh.common.util.UrlFilterUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.ask.entity.QuestionsDetailEntity
import com.gh.gamecenter.ask.entity.QuestionsIndexEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.mvvm.NetworkBoundResource
import com.gh.gamecenter.mvvm.Resource
import com.gh.gamecenter.mvvm.Status
@ -22,6 +25,7 @@ import okhttp3.MediaType
import okhttp3.RequestBody
import okhttp3.ResponseBody
import org.json.JSONObject
import retrofit2.HttpException
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import java.net.HttpURLConnection
@ -40,6 +44,7 @@ class QuestionsEditViewModel : AndroidViewModel {
private var mCommunityId: String? = null
val mProcessDialog = MediatorLiveData<WaitingDialogFragment.WaitingDialogData>()
val mTitleTipData = MediatorLiveData<MutableList<QuestionsIndexEntity>>()
val mTitleTagsLD: LiveData<Resource<List<String>>>
@ -68,6 +73,41 @@ class QuestionsEditViewModel : AndroidViewModel {
})
}
var mLastSearchKey: String? = null
var mListPage: Int = 1
var isLoading: Boolean = false
fun getTitleTipData(key: String) {
if (isLoading) return
isLoading = true
var list: MutableList<QuestionsIndexEntity>?
if (!mLastSearchKey.isNullOrEmpty() && mLastSearchKey == key) {
list = if (mTitleTipData.value != null) mTitleTipData.value else ArrayList()
} else {
mListPage = 1
list = ArrayList()
}
RetrofitManager
.getInstance(context).api
.getAskSearchByTitle(UserManager.getInstance().getCommunityId(context),
UrlFilterUtils.getFilterQuery("keyword", key), mListPage)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<List<QuestionsIndexEntity>>() {
override fun onResponse(response: List<QuestionsIndexEntity>?) {
list?.addAll(response!!)
mTitleTipData.postValue(list)
mLastSearchKey = key
mListPage++
isLoading = false
}
override fun onFailure(e: HttpException?) {
isLoading = false
}
})
}
fun getDefaultTag(communityId: String?) {
mCommunityId = if (mQuestionEntity != null) mQuestionEntity?.communityId else communityId
mApiService

View File

@ -15,6 +15,7 @@ import android.widget.EditText
import android.widget.TextView
import com.gh.base.fragment.BaseDialogWrapperFragment
import com.gh.base.fragment.BaseFragment
import com.gh.base.fragment.WaitingDialogFragment
import com.gh.common.util.AskErrorResponseUtils
import com.gh.common.util.DisplayUtils
import com.gh.common.util.LoginUtils
@ -78,6 +79,7 @@ class TagsSelectFragment : BaseFragment<String>() {
mViewModel?.postQuestion()?.observe(this, Observer { it ->
when (it?.status) {
Status.SUCCESS -> {
mViewModel?.mProcessDialog?.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false))
toast("提交成功")
if (mViewModel?.mQuestionEntity != null) { // 修改问题
val data = Intent()
@ -90,11 +92,15 @@ class TagsSelectFragment : BaseFragment<String>() {
activity?.finish()
}
Status.ERROR -> {
mViewModel?.mProcessDialog?.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false))
if (!LoginUtils.userPostErrorToast(it.exception, context, false)) {
toast("提交失败")
AskErrorResponseUtils.errorResponseControl(context, it.exception)
}
}
Status.LOADING -> {
mViewModel?.mProcessDialog?.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", true))
}
}
})
}

View File

@ -1,40 +1,30 @@
package com.gh.gamecenter.ask.questionsedit.tip
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import com.gh.common.util.UrlFilterUtils
import com.gh.gamecenter.QuestionsDetailActivity
import android.widget.BaseAdapter
import android.widget.TextView
import com.gh.gamecenter.R
import com.gh.gamecenter.ask.entity.QuestionsIndexEntity
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.google.gson.Gson
/**
* Created by khy on 3/05/18.
*/
class QuestionTitleTipAdapter(private val context: Context) : BaseAdapter(), Filterable {
class QuestionTitleTipAdapter(private val context: Context) : BaseAdapter() {
var questionList: MutableList<QuestionsIndexEntity> = arrayListOf()
val onItemClickListener = OnItemClickListener()
override fun getView(pos: Int, convertView: View?, parent: ViewGroup?): View {
val view: View
if (convertView == null) {
view = LayoutInflater.from(context).inflate(R.layout.question_edit_title_search_item, convertView, false)
view.tag = view
} else {
view = convertView
view = convertView.tag as View
}
var entity = questionList[pos]
val entity = questionList[pos]
view.findViewById<TextView>(R.id.questions_edit_index_title).text = entity.title
view.findViewById<TextView>(R.id.questions_edit_index_answer_count).text = context.getString(R.string.ask_answer_count, entity.answerCount)
return view
@ -53,52 +43,8 @@ class QuestionTitleTipAdapter(private val context: Context) : BaseAdapter(), Fil
return questionList.size
}
override fun getFilter(): Filter {
return QuestionTitleFilter()
fun setListData(list: MutableList<QuestionsIndexEntity>) {
questionList = list
notifyDataSetChanged()
}
inner class QuestionTitleFilter : Filter() {
override fun performFiltering(prefix: CharSequence?): FilterResults {
// Log.i("!!!", prefix.toString())
val results = FilterResults()
if (prefix.isNullOrBlank()) return results
RetrofitManager
.getInstance(context).api
.getAskSearchByTitle(UserManager.getInstance().getCommunityId(context), UrlFilterUtils.getFilterQuery("keyword", prefix.toString()), 1)
.subscribe(object : Response<List<QuestionsIndexEntity>>() {
override fun onResponse(response: List<QuestionsIndexEntity>?) {
results.values = response
results.count = response!!.size
}
})
return results
}
override fun publishResults(constant: CharSequence?, results: FilterResults?) {
if (results != null && results.count > 0) {
questionList = results.values as ArrayList<QuestionsIndexEntity>
// Log.i("!!!", "r:" + questionList.count())
notifyDataSetChanged()
}
}
}
inner class OnItemClickListener : AdapterView.OnItemClickListener {
override fun onItemClick(p0: AdapterView<*>?, p1: View?, pos: Int, p3: Long) {
val intent = Intent(context, QuestionsDetailActivity::class.java)
intent.putExtra("question", Gson().toJson(questionList[pos]))
context.startActivity(intent)
}
}
}

View File

@ -0,0 +1,25 @@
package com.gh.gamecenter.ask.questionsedit.tip;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.ListPopupWindow;
import com.gh.common.util.DisplayUtils;
/**
* Created by khy on 5/05/18.
*/
public class QuestionTitleTipPopuListView extends ListPopupWindow {
public QuestionTitleTipPopuListView(@NonNull Context context) {
super(context);
}
public QuestionTitleTipPopuListView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setHeight(DisplayUtils.dip2px(context, 200));
}
}