2

我有以下应用程序架构(为简化而通用):

主要Layout包括ActionBar自定义View和可滚动Tabs,以及ViewPager托管多个ListFragments。每个ListFragment都有自己的一组数据(1 行 = ImageView+ TextView),这些数据是从 SQLite 数据库加载的。在我的ActionBar's习惯View中有一个“搜索”EditText

当用户开始输入内容时,我想在数据库中执行“on-the-go”搜索并以下拉列表的形式显示匹配的名称(这些名称应该是可点击的)。我看到了一些如何在 a 中执行搜索的示例ListView,但与数据库搜索无关。

所以问题是:如何将数据库搜索结果显示为下拉列表并在用户添加或删除字符时刷新它?

4

3 回答 3

10

您需要实现AutoCompleteTextView。这允许在用户键入时提出建议。您可以使用Adapters绑定要搜索的数据。

这应该可以解决您的问题。

可以在此处找到一个可能有用的示例。

于 2013-08-19T23:24:34.323 回答
4

您可以实现OnQueryTextListener()接口并覆盖该onQueryTextChange(String text)方法 - 此方法在字符更改时被调用。就像是

searchTextInstance.setOnQueryTextListener(new CustomQueryListener());

onQueryTextChange(Sting text)查询您的数据库,然后调用

CustomAdapter adapter = new CustomAdapter()
//... populate the adapter with the query results and call
searchTextInstance.setSuggestionAdapter(adapter)

其中 CustomAdapter 是一个扩展 SimpleCursorAdapter 的类,此实例由您的查询结果填充(将在下拉菜单中显示的结果)。

要使选择可点击,您可以将自定义 OnSuggestionListener() 设置为您的searchTextInstance,即

searchTextInstance.setOnSuggestionListener(new CustomSuggestionListener());

where CustomSuggestionListenerimplements OnSuggestoinListener- 接口的唯一方法,onSuggestionClick(int postion)将实现您的目标

于 2013-08-19T23:35:38.270 回答
0

要在下拉列表中查看搜索结果,您可以使用PopupWindow

获得搜索结果后,我在房间数据库中实现它

从数据库中获取数据

   private fun searchCustomer(param: String) {
    var listOfCustomer = ArrayList<LocalCustomer>()
    localCustomerRepository.searchLocalCustomers(param).observe(this,
        Observer<List<LocalCustomer>> { localCustomerList ->
            listOfCustomer = localCustomerList as ArrayList

            if (listOfCustomer.size > 0) {
                val locationAdapter = CustomerAdapter(context, listOfCustomer)
                setupPopupWindow(listOfCustomer)
            } else {
                Utils.showMsg(this, "No result found")
            }
        })


}

设置弹出窗口

 private fun setupPopupWindow(listOfCustomer: ArrayList<LocalCustomer>) {
    val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val layout = inflater.inflate(R.layout.spinner_list, null)
    val popupWindow =
        PopupWindow(layout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
    popupWindow.showAsDropDown(svSearch, 0, 0)
    val locationAdapter = CustomerAdapter(context, listOfCustomer)
    val listView = layout.findViewById(R.id.lvMenu) as ListView
    listView.adapter = locationAdapter
    listView.onItemClickListener = AdapterView.OnItemClickListener { adapterView, 
    view, position, id ->

        popupWindow.dismiss()
    }

}

spinner_list

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/text_vvvvlight_gry"
android:orientation="vertical">

<ListView
    android:id="@+id/lvMenu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:elevation="4dp"/>
</LinearLayout>

搜索视图

svSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(p0: String?): Boolean {
            return true
        }

        override fun onQueryTextChange(param: String?): Boolean {
            if (param != null && param != "")
                searchCustomer(param)
            return true
        }
    })

CustomerAdapter将是一个 baseAdapter 或者您可以使用 ArrayAdapter

于 2019-04-09T09:48:55.720 回答