搜索数据库中的项目并显示下拉列表

问题描述 投票:2回答:3

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

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

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

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

android android-sqlite android-search
3个回答
9
投票

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

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

可以找到一个可能有用的例子here


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());

其中CustomSuggestionListener实现OnSuggestoinListener - 接口的唯一方法,onSuggestionClick(int postion)将实现你的目标


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

© www.soinside.com 2019 - 2024. All rights reserved.