如何在 Android 中使用 EditText 和 TextWatcher 在 ListView 中搜索项目?
一些应用程序提供了一个搜索栏,用于从项目列表中查找任何特定项目。从技术上讲,搜索栏是 EditText,项目列表可以是 ListView、RecyclerView 或包含某些项目的 GridView。现在,当用户在 EditText 中键入内容时,列表必须根据用户键入的文本进行更新。字符串匹配算法用于检查键入的文本是否是任何列表项的子字符串,如果有,则这些项显示在更新的 ListView 中。但是,创建单独的函数或算法来执行此搜索操作会在编辑器上消耗更多行。为此,可以使用 TextWatcher 对象,这是一个公共接口,它在 EditText 上实现并检查文本是否更改。因此,在本文中,我们将向您展示如何在 EditText 上实现 TextWatcher,以在用户给出输入时更新结果 ListView。 IDE 准备就绪后,请按照以下步骤操作。
分步实施
第 1 步:在 Android Studio 中创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在Kotlin中演示了该应用程序,因此请确保在创建新项目时选择 Kotlin 作为主要语言。
第 2 步:使用 activity_main.xml 文件
导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。在 Activity 的顶部创建一个 EditText,它应该是假定的搜索栏,在其下方创建一个 ListView,用于显示项目。
XML
Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.ListView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Declare and Initialize the EditText
// and ListView from the layout file.
val mSearch = findViewById(R.id.edit_text)
val mListView = findViewById(R.id.list_view)
// Declare array of elements, create an adapter
// and display the array in the ListView
val mCities = arrayOf("Mumbai", "Mohali", "Delhi", "Dehradun", "Darjeeling", "Bengaluru")
val mArrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, mCities)
mListView.adapter = mArrayAdapter
// TextWatcher to check if the EditText text changes
mSearch.addTextChangedListener(object: TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
// Do Nothing
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
mArrayAdapter.filter.filter(s)
}
override fun afterTextChanged(s: Editable?) {
// Do Nothing
}
})
}
}
第 3 步:使用MainActivity.kt 文件
转到MainActivity.kt文件并参考以下代码。下面是MainActivity.kt文件的代码。我们声明了一个项目数组,如代码所示。这些项目最初使用适配器显示在 ListView 中。接下来,TextWatcher 在 EditText 上实现。 TextWatcher 实现了三个成员函数,即 beforeTextChanger()、onTextChanged() 和 afterTextChanged()。我们关心onTextChanged()因为我们想在文本实时更改时更新 ListView。此函数从 EditText 中获取整个字符串,根据输入过滤适配器以查找数组元素,并显示更新的 ListView。代码中添加了注释以更详细地理解代码。
科特林
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.ListView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Declare and Initialize the EditText
// and ListView from the layout file.
val mSearch = findViewById(R.id.edit_text)
val mListView = findViewById(R.id.list_view)
// Declare array of elements, create an adapter
// and display the array in the ListView
val mCities = arrayOf("Mumbai", "Mohali", "Delhi", "Dehradun", "Darjeeling", "Bengaluru")
val mArrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, mCities)
mListView.adapter = mArrayAdapter
// TextWatcher to check if the EditText text changes
mSearch.addTextChangedListener(object: TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
// Do Nothing
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
mArrayAdapter.filter.filter(s)
}
override fun afterTextChanged(s: Editable?) {
// Do Nothing
}
})
}
}
输出:
我们可以看到 ListView 是根据给定的输入更新的。