📜  如何在 Android 中使用 EditText 和 TextWatcher 在 ListView 中搜索项目?

📅  最后修改于: 2022-05-13 01:54:27.540000             🧑  作者: Mango

如何在 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 是根据给定的输入更新的。