📜  房间数据库中的Android SearchView

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

房间数据库中的Android SearchView

数据库中的 SearchView 是一个非常基本的功能,您在日常生活中的大多数应用程序中都可以看到,那么为什么不呢,您应该学习并实现它。在您的应用程序中实现它并不太复杂。有很多更简单的方法可以用来实现它。您应该用来实现应用内搜索视图的任务是:-

  1. 您需要创建一个菜单项设置 actionViewClass 到 SearchView 并设置其他操作视图属性
  2. 然后在您想要搜索功能的操作的 onCreateOptionsMenu() 方法中扩充菜单。
  3. 然后从菜单中获取 SearchView 对象并通过调用 setOnQueryTextListener 方法向其添加 SearchView.OnQueryTextListener 。
  4. SearchView.OnQueryTextListener 有两个回调方法 onQueryTextSubmit 和 onQueryTextChange
  5. 当用户通过点击搜索小部件上的输入按钮或点击提交按钮提交搜索时,将调用 onQueryTextSubmit 方法。

在此方法中,可以使用输入到搜索视图小部件中的文本执行数据库搜索。您可以通过调用 setSubmitButtonEnabled 方法并传递布尔值 true 来启用搜索视图小部件中的搜索按钮。这是一个基本的想法,它是如何工作的。但是我们将讨论从房间数据库中搜索数据的最有效方法,为此,您应该了解一些概念,例如:

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!

先决条件:

  • 如何使用房间数据库在 recyclerView 中显示数据(什么是适配器)
  • 什么是 ROOM 数据库(库)
  • 熟悉Model-View-ViewModel架构(MVVM)
  • 最重要的一个是依赖注入(dagger hilt)

除此之外,我们不会从头开始创建应用程序,我们将提供初始内容的源代码,例如



  • 通过数据库更新 RecyclerView 中的数据
  • 使用依赖注入
  • 并创建了一些额外的类

我们正在为您提供该项目的快速概述,然后您将很容易理解它。单击此处下载项目。

分步实施

第 1 步:从 GitHub 下载项目并将其添加到您的 android studio

我们希望你们都知道如何将现有项目导入 android studio 如果没有然后转到文件 > 打开 > 选择下载的项目 > 然后等待...完成项目构建

第 2 步:build.Gradle 文件

导航到 app > Gradle Scripts > build.Gradle 文件并在依赖项部分添加以下依赖项。

  • 我们添加了一些依赖项和插件
  • 并启用视图绑定
plugins {
   id 'com.android.application'
   id 'kotlin-android'
   id 'kotlin-kapt'     // dagger hilt plugin 
   id 'dagger.hilt.android.plugin'
}

android {

   compileSdkVersion 30
   buildToolsVersion "30.0.2"
   defaultConfig {
       applicationId "com.example.searchViewInRoom"
       minSdkVersion 21
       targetSdkVersion 30
       versionCode 1
       versionName "1.0"
       testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }

   // here we have enabled viewBinding
   buildFeatures {
       viewBinding true
   }

   buildTypes {
       release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       }
   }

   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

   kotlinOptions {
       jvmTarget = '1.8'
   }

}

dependencies {
   implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
   implementation 'androidx.core:core-ktx:1.3.2'
   implementation 'androidx.appcompat:appcompat:1.2.0'
   implementation 'com.google.android.material:material:1.2.1'
   implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
   testImplementation 'junit:junit:4.13.1'
   androidTestImplementation 'androidx.test.ext:junit:1.1.2'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

   // Navigation Component
   implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'

   // Room components
   implementation "androidx.room:room-runtime:2.2.6"

   kapt "androidx.room:room-compiler:2.2.6"
   implementation "androidx.room:room-ktx:2.2.6"

   androidTestImplementation "androidx.room:room-testing:2.2.6"

   // Dagger - Hilt
   implementation "com.google.dagger:hilt-android:2.28.3-alpha"

   kapt "com.google.dagger:hilt-android-compiler:2.28.3-alpha"
   implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
   kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"

   // Lifecycle
   implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
   implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
   implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}

第 3 步:创建实体/表

转到应用 > 主 > searchViewInRoom > 数据 > person.kt。这就是我们如何使用 room 在 SQLite 数据库中创建实体/表

Kotlin
package com.example.searchViewInRoom.data
  
import androidx.room.Entity
import androidx.room.PrimaryKey
  
// it's our data class that we have
// annotate @Entity to create it as table
@Entity(tableName = "person_table")
data class Person(
    // table is basically 
      // having 3 fields as follow....
    var firstName: String,
    var lastName: String,
    var age: Int
){
    @PrimaryKey(autoGenerate = true)
    // we make id as primary 
      // key and it will autogenerate
    var id: Int = 0
}


Kotlin
package com.example.searchViewInRoom.data
  
import androidx.room.Database
import androidx.room.RoomDatabase
// it's our database and here we 
// specify entities, our version and exportSchema
@Database(
    entities = [Person::class],
    version = 1,
    exportSchema = false
)
// in our database we have just extended RoomDatabase class
abstract class PersonDatabase: RoomDatabase() {
    // as you can see it is our abstract fun and 
    // it represent our Data Access Object (dao)
    abstract fun personDao(): PersonDao
}


Kotlin
package com.example.searchViewInRoom.di
  
import android.content.Context
import androidx.room.Room
import com.example.searchViewInRoom.data.PersonDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ApplicationComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Singleton
  
// this is a very important step actually
// here we used dependency injection library dagger hilt
// it actually provide our database object and dao
  
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
  
    @Singleton
    @Provides
    fun provideDatabase(
        @ApplicationContext context: Context
    ) = Room.databaseBuilder(
        context,
        PersonDatabase::class.java,
        "person_database"
    ).build()
  
    @Singleton
    @Provides
    fun provideDao(database: PersonDatabase) = database.personDao()
  
}


Kotlin
package com.example.searchViewInRoom.data
  
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
  
// here we have our Dao having three
// different queries as follows.....
@Dao
interface PersonDao {
  
    // it's basically for reading our database
    @Query("SELECT * FROM person_table ORDER BY id ASC")
    fun readData(): Flow>
  
    // it's for inserting person object to our database
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertData(person: Person)
  
    // it's very important one for this article because
    //it's a query for searching our database
    /*
    so here we have written basic sql query for searching our database
    basically will search from our person table or entity
    where our first name and last name contains some characters from our searchquery
     */
    @Query("SELECT * FROM person_table WHERE firstName LIKE :searchQuery OR lastName LIKE :searchQuery")
    // and then search query will be passed through 
    // the perimeter of this function
    // and then function will return the flow of list of person
    fun searchDatabase(searchQuery: String): Flow>
  
}


Kotlin
package com.example.searchViewInRoom.data
  
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
// it's repository
  
/*
here we have basically injected our person Dao for our dao interface
and having three function as well........ */
class Repository @Inject constructor(
    private val personDao: PersonDao
) {
  
    fun readData(): Flow> {
        return personDao.readData()
    }
  
    suspend fun insertData(person: Person) {
        personDao.insertData(person)
    }
  
    fun searchDatabase(searchQuery: String): Flow> {
        return personDao.searchDatabase(searchQuery)
    }
  
}


Kotlin
package com.example.searchViewInRoom.viewmodel
  
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.data.Repository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
  
// here we have our viewModel
  
// and we are going to use it for receiving
// and observing data from our database
class MainViewModel @ViewModelInject constructor(
    private val repository: Repository
) : ViewModel() {
  
    val readData = repository.readData().asLiveData()
  
    fun insertData(person: Person){
        viewModelScope.launch(Dispatchers.IO) {
            repository.insertData(person)
        }
    }
  
    fun searchDatabase(searchQuery: String): LiveData> {
        return repository.searchDatabase(searchQuery).asLiveData()
    }
  
}


XML


    
    
    
  
    
    
    
    
  


XML


  

  
    
  
    
  
    
  



XML


  
    
  


Kotlin
package com.example.searchViewInRoom
  
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
  
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
  
    // as you can see this is my main activity and
    // here we have created view binding for binding our views
    private lateinit var binding: ActivityMainBinding
  
    // here we have initialized our mainViewModel
    private val mainViewModel: MainViewModel by viewModels()
      
    // and recycler view adapter
    private val myAdapter: MyAdapter by lazy { MyAdapter() }
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
  
        // here we are using linear layout manager for our recyclerView
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
          
        // here we are setting my recyclerView 
        // to custom adapter that we have already made
        binding.recyclerView.adapter = myAdapter
  
        // here we are observing data by mainViewModel 
        // using readData variable
        mainViewModel.readData.observe(this, {
            // using custom recyclerView adapter we have 
            // set the data to our recycler view
            myAdapter.setData(it)
        })
  
    }
  }


Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_menu, menu)
 
    val search = menu?.findItem(R.id.menu_search)
    val searchView = search?.actionView as? SearchView
    searchView?.isSubmitButtonEnabled = true
      // here you get error but don't worry
    searchView?.setOnQueryTextListener(this) 
    return true
}


Kotlin
package com.example.searchViewInRoom
  
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
  
@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
  
    // as you can see this is my main activity and
    // here we have created view binding for binding our views
    private lateinit var binding: ActivityMainBinding
  
    // here we have initialized our mainViewModel
    private val mainViewModel: MainViewModel by viewModels()
      
    // and recycler view adapter
    private val myAdapter: MyAdapter by lazy { MyAdapter() }
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
  
        // here we are using linear layout manager for our recyclerView
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
          
        // here we are setting my recyclerView to 
        // custom adapter that i have already made
        binding.recyclerView.adapter = myAdapter
  
        // here we are observing data by mainViewModel 
        // using readData variable
        mainViewModel.readData.observe(this, {
            // using custom recyclerView adapter 
            // we have set the data to our recycler view
            myAdapter.setData(it)
        })
  
    }
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main_menu, menu)
  
        val search = menu?.findItem(R.id.menu_search)
        val searchView = search?.actionView as? SearchView
        searchView?.isSubmitButtonEnabled = true
        searchView?.setOnQueryTextListener(this)
        return true
    }


Kotlin
override fun onQueryTextSubmit(query: String?): Boolean {
       // it will triggered when 
       // we submit the written test
       return true
   }
   // this function will triggered when we 
   // write even a single char in search view
   override fun onQueryTextChange(query: String?): Boolean {
       if(query != null){
           searchDatabase(query)
       }
       return true
   }
   // We have just created this function for searching our database
   private fun searchDatabase(query: String) {
       // %" "% because our custom sql query will require that
       val searchQuery = "%$query%"
 
       mainViewModel.searchDatabase(searchQuery).observe(this, { list ->
           list.let {
               myAdapter.setData(it)
           }
       })


Kotlin
fun additem(view: android.view.View) {
    mainViewModel.insertData(Person("Krish", "joshi", 18))
    mainViewModel.insertData(Person("Sukant", "desai", 38))
    mainViewModel.insertData(Person("Anye", "jems", 40))
    mainViewModel.insertData(Person("Geek", "geek", 76))
    mainViewModel.insertData(Person("Alok", "pro", 45))
    mainViewModel.insertData(Person("Kushi", "singh", 34))
    mainViewModel.insertData(Person("Final", "step", 23))
    mainViewModel.insertData(Person("Vidyut", "sharma", 20))
    mainViewModel.insertData(Person("Ankit", "chaudhary", 19))
    mainViewModel.insertData(Person("Abhay", "yadav", 16))
}


第 4 步:创建数据库

转到应用程序 > 主 > searchViewInRoom > 数据 > personDatabase.kt。这就是您可以创建数据库的方式。请阅读评论以获得更好的理解。

科特林

package com.example.searchViewInRoom.data
  
import androidx.room.Database
import androidx.room.RoomDatabase
// it's our database and here we 
// specify entities, our version and exportSchema
@Database(
    entities = [Person::class],
    version = 1,
    exportSchema = false
)
// in our database we have just extended RoomDatabase class
abstract class PersonDatabase: RoomDatabase() {
    // as you can see it is our abstract fun and 
    // it represent our Data Access Object (dao)
    abstract fun personDao(): PersonDao
}

第五步:数据库模块类

转到 app > main > searchViewInRoom > di > DatabaseModule.kt。这里我们使用依赖注入

科特林

package com.example.searchViewInRoom.di
  
import android.content.Context
import androidx.room.Room
import com.example.searchViewInRoom.data.PersonDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ApplicationComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Singleton
  
// this is a very important step actually
// here we used dependency injection library dagger hilt
// it actually provide our database object and dao
  
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
  
    @Singleton
    @Provides
    fun provideDatabase(
        @ApplicationContext context: Context
    ) = Room.databaseBuilder(
        context,
        PersonDatabase::class.java,
        "person_database"
    ).build()
  
    @Singleton
    @Provides
    fun provideDao(database: PersonDatabase) = database.personDao()
  
}

第 6 步:Dao(数据访问对象)类

转到应用程序 > 主 > searchViewInRoom > 数据 > personDao.kt

科特林

package com.example.searchViewInRoom.data
  
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
  
// here we have our Dao having three
// different queries as follows.....
@Dao
interface PersonDao {
  
    // it's basically for reading our database
    @Query("SELECT * FROM person_table ORDER BY id ASC")
    fun readData(): Flow>
  
    // it's for inserting person object to our database
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertData(person: Person)
  
    // it's very important one for this article because
    //it's a query for searching our database
    /*
    so here we have written basic sql query for searching our database
    basically will search from our person table or entity
    where our first name and last name contains some characters from our searchquery
     */
    @Query("SELECT * FROM person_table WHERE firstName LIKE :searchQuery OR lastName LIKE :searchQuery")
    // and then search query will be passed through 
    // the perimeter of this function
    // and then function will return the flow of list of person
    fun searchDatabase(searchQuery: String): Flow>
  
}

步骤 7:创建存储库类



转到应用程序 > 主 > searchViewInRoom > 数据 > Repository.kt

科特林

package com.example.searchViewInRoom.data
  
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
// it's repository
  
/*
here we have basically injected our person Dao for our dao interface
and having three function as well........ */
class Repository @Inject constructor(
    private val personDao: PersonDao
) {
  
    fun readData(): Flow> {
        return personDao.readData()
    }
  
    suspend fun insertData(person: Person) {
        personDao.insertData(person)
    }
  
    fun searchDatabase(searchQuery: String): Flow> {
        return personDao.searchDatabase(searchQuery)
    }
  
}

第 8 步:主视图模型

转到 app > main > searchViewInRoom>viewmodel > MainViewModel.kt。我们将使用这个模块来接收和观察来自数据库的数据。

科特林

package com.example.searchViewInRoom.viewmodel
  
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.data.Repository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
  
// here we have our viewModel
  
// and we are going to use it for receiving
// and observing data from our database
class MainViewModel @ViewModelInject constructor(
    private val repository: Repository
) : ViewModel() {
  
    val readData = repository.readData().asLiveData()
  
    fun insertData(person: Person){
        viewModelScope.launch(Dispatchers.IO) {
            repository.insertData(person)
        }
    }
  
    fun searchDatabase(searchQuery: String): LiveData> {
        return repository.searchDatabase(searchQuery).asLiveData()
    }
  
}

上面提到的所有这些类都已经在您下载的项目中,这是一个快速概览。现在让我们转到给定项目的 XML 部分……

activity_main.xml 文件

现在我们必须导航到app > res > activity_main.xml并理解以下代码。

XML



    
    
    
  
    
    
    
    
  

row_layout.xml 文件



这是一个项目视图,我们必须添加到 RecyclerView

XML



  

  
    
  
    
  
    
  


这就是我给你的整个项目,之后你的应用程序应该是这样的......

但是如果给定的列表显示得很好,否则别担心,我们会管理它。现在让我们开始文章的真正部分(SearchView 的实现)。这里只有三个步骤来实现您的搜索功能,如下所示……

  • 在屏幕上的任意位置添加搜索图标
  • 覆盖 onCreateOptionsMenu() 方法
  • 然后在我们的 mainActivity 中实现 onQueryTextListner

就是这样。所以让我们去做吧。

第 1 步:在屏幕上的任意位置添加搜索图标

我们将它添加到应用程序的右上角。为此,您必须通过资源管理器 > 菜单 > 添加菜单资源文件来创建菜单项

XML



  
    
  

第 2 步:覆盖 onCreateOptionsMenu() 方法



转到 MainActivity.kt。它已经有一些代码,但请阅读我在那里提到的评论,您也可以轻松理解它。

科特林

package com.example.searchViewInRoom
  
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
  
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
  
    // as you can see this is my main activity and
    // here we have created view binding for binding our views
    private lateinit var binding: ActivityMainBinding
  
    // here we have initialized our mainViewModel
    private val mainViewModel: MainViewModel by viewModels()
      
    // and recycler view adapter
    private val myAdapter: MyAdapter by lazy { MyAdapter() }
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
  
        // here we are using linear layout manager for our recyclerView
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
          
        // here we are setting my recyclerView 
        // to custom adapter that we have already made
        binding.recyclerView.adapter = myAdapter
  
        // here we are observing data by mainViewModel 
        // using readData variable
        mainViewModel.readData.observe(this, {
            // using custom recyclerView adapter we have 
            // set the data to our recycler view
            myAdapter.setData(it)
        })
  
    }
  }

理解了上面的代码后,只要得到override onCreateOptionsMenu()

  • 获取只需按 ctrl+o 并搜索此函数然后按 Enter
  • 我们必须覆盖这个函数,以便我们可以在此处添加我们的菜单,如下所示。

科特林

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_menu, menu)
 
    val search = menu?.findItem(R.id.menu_search)
    val searchView = search?.actionView as? SearchView
    searchView?.isSubmitButtonEnabled = true
      // here you get error but don't worry
    searchView?.setOnQueryTextListener(this) 
    return true
}

在第 2 步之后,您的主要活动将如下所示……

科特林

package com.example.searchViewInRoom
  
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.searchViewInRoom.adapter.MyAdapter
import com.example.searchViewInRoom.data.Person
import com.example.searchViewInRoom.databinding.ActivityMainBinding
import com.example.searchViewInRoom.viewmodel.MainViewModel
import dagger.hilt.android.AndroidEntryPoint
  
@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
  
    // as you can see this is my main activity and
    // here we have created view binding for binding our views
    private lateinit var binding: ActivityMainBinding
  
    // here we have initialized our mainViewModel
    private val mainViewModel: MainViewModel by viewModels()
      
    // and recycler view adapter
    private val myAdapter: MyAdapter by lazy { MyAdapter() }
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
  
        // here we are using linear layout manager for our recyclerView
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
          
        // here we are setting my recyclerView to 
        // custom adapter that i have already made
        binding.recyclerView.adapter = myAdapter
  
        // here we are observing data by mainViewModel 
        // using readData variable
        mainViewModel.readData.observe(this, {
            // using custom recyclerView adapter 
            // we have set the data to our recycler view
            myAdapter.setData(it)
        })
  
    }
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main_menu, menu)
  
        val search = menu?.findItem(R.id.menu_search)
        val searchView = search?.actionView as? SearchView
        searchView?.isSubmitButtonEnabled = true
        searchView?.setOnQueryTextListener(this)
        return true
    }

第三步:在 MainActivity.kt 中实现 onQueryTextListner

在主要活动中实现您的 setOnQueryTextListener 以将“this”作为边界传递

  • 对于实现,只需在 MainActivity 类之后添加 SearchView.OnQueryTextListener :AppCompatActivity() 就像......。类 MainActivity : AppCompatActivity(), SearchView.OnQueryTextListener
  • 在显示另一个错误后,只需将光标移动到错误处并按 alt+Enter
  • 那么你将有两个名为 onQueryTextChange() 和 onQueryTextChange() 的函数
  • 然后只需将这两个功能实现为

科特林

override fun onQueryTextSubmit(query: String?): Boolean {
       // it will triggered when 
       // we submit the written test
       return true
   }
   // this function will triggered when we 
   // write even a single char in search view
   override fun onQueryTextChange(query: String?): Boolean {
       if(query != null){
           searchDatabase(query)
       }
       return true
   }
   // We have just created this function for searching our database
   private fun searchDatabase(query: String) {
       // %" "% because our custom sql query will require that
       val searchQuery = "%$query%"
 
       mainViewModel.searchDatabase(searchQuery).observe(this, { list ->
           list.let {
               myAdapter.setData(it)
           }
       })

是的!我们已经成功实现了搜索功能。你可以点击这里下载最终的源代码

现在运行您的应用程序并查看。您的应用程序是否在回收站视图中显示虚拟数据?如果是,那么您现在已经完成了,您可以搜索某些内容,它会显示结果,

但是,如果不这样做,则使用一些步骤添加一些虚拟数据,例如……

  • 在 MainActivity.kt 类中创建一个类似“fun additem()”的函数
  • 然后使用 mainViewModel.insertData(Person("字符串 : name", "字符串: lastname", int :age)) 插入数据,如下代码所示
  • 现在只需在单击浮动操作按钮时调用 additem()函数,或者根据需要调用。

科特林

fun additem(view: android.view.View) {
    mainViewModel.insertData(Person("Krish", "joshi", 18))
    mainViewModel.insertData(Person("Sukant", "desai", 38))
    mainViewModel.insertData(Person("Anye", "jems", 40))
    mainViewModel.insertData(Person("Geek", "geek", 76))
    mainViewModel.insertData(Person("Alok", "pro", 45))
    mainViewModel.insertData(Person("Kushi", "singh", 34))
    mainViewModel.insertData(Person("Final", "step", 23))
    mainViewModel.insertData(Person("Vidyut", "sharma", 20))
    mainViewModel.insertData(Person("Ankit", "chaudhary", 19))
    mainViewModel.insertData(Person("Abhay", "yadav", 16))
}
  • 如果要使用浮动操作按钮插入数据
  • 然后只需将此行添加到您的浮动操作按钮代码中

就是这样,您的数据也将显示在您的应用程序中,现在您还可以检查搜索……。最后,该应用程序正在运行

输出: