popupwindow 实现搜索历史列表

kotlin 配合 searchview listpopupwindow


开始的代码

class SearchActivity : AppCompatActivity(), SearchContract.SearchUIView {
   private lateinit var searchView: SearchView
   private lateinit var historyRecord: MutableList
   private lateinit var popupWindow: ListPopupWindow

   override fun onCreate(savedInstanceState: Bundle?) {
       if(!searchView.isFocused){
           val view = searchView
           showListPopupWindow(view)
       }
    }
   
   private fun showListPopupWindow(view :View){
       popupWindow = ListPopupWindow(this)
       popupWindow.run {
           width = resources.displayMetrics.widthPixels
           height = ListPopupWindow.MATCH_PARENT
           setFinishOnTouchOutside(true)
           setBackgroundDrawable(ColorDrawable(ContextCompat.getColor(this@SearchActivity,R.color.white_color)))
           setAdapter(ArrayAdapter(applicationContext,android.R.layout.activity_list_item,historyRecord))
           setOnItemClickListener { parent, view, position, id ->
               //把文字内容填充到searchveiw
               popupWindow.dismiss()
           }
           anchorView = view
           horizontalOffset = 0
           verticalOffset = 0
           isModal = true
       }
       searchView.setOnClickListener { popupWindow.show() }
   }
}

错误1 :开始执行 showListPopupWindow()就黑屏

分析1

popupwindow 的触发事件不对,要想实现焦点在搜索框就会出现搜索历史提示功能,isFocused 是不能的。
isFocused 方法返回的永远是 false ,因为它是真正拥有焦点的 SearchView,而不是 SearchView 本身。
所以我换了 popupwindow 的触发方法

searchView.setOnQueryTextFocusChangeListener { view, b ->
           if (b){
               val view = searchView
               showListPopupWindow(view,db)
               popupWindow.show()
           }
       }//焦点改变触发 popupwindow

错误2 :一开始还是 popupwindow 还是弹不出来

分析2

一开始 SearchView 的焦点没有改变,所以在这之前应该清除SearchView 的焦点

searchView.clearFocus()

错误3 :输一次东西 popupwindow 就会消失

分析3

popupwindow的消失问题,应该和dismiss()方法的调用有关,我希望点提交或者其他地方的时候popupwindow消失,所以

searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                ......
                searchPresenter.loadSearchData(keyword, page)
                hideInputKeyboard()
                popupWindow.dismiss()
                return true
            }

            override fun onQueryTextChange(newText: String): Boolean {
                return false
            }
        })

错误4:一次只能输一个东西,必须要再点击搜索框才能继续再次输入一次

分析4

应该也是焦点问题,popupwindow 弹出来之后焦点就到 popupwindow 上了,应该使 popupwindow 不再自动获取焦点,找了很久都没有在 listpopupwindow 里找到这个方法,最后看源码发现,这个方法被封装到isModal了。

 isModal = false//内部封装的是focused,设置成false才能是popupwindow不自动获取焦点

错误5 : 修改之后,只有在最开始点击搜索框的时候弹出popupwindow

分析5

因为我写的 popupwindow 的触发事件是 searchView 的焦点改变,为了保证我在点击其他地方再回到searchView的时候popupwindow依然能弹出来

popupWindow.apply {
                setOnDismissListener {
                    searchView.clearFocus()
                }
            }

总结

主要是焦点问题,要考虑清楚怎么处理焦点,才能满足自己想要的功能

你可能感兴趣的:(popupwindow 实现搜索历史列表)