首页 > 解决方案 > 搜索视图不起作用

问题描述

我需要使用 SearchView 来过滤我的 CardViews RecyclerView,但到目前为止我还没有设法让它工作。我使用 Room 符号来获取应用程序数据库中的数据,并以此生成卡片。我需要将 SearchView 与我的对象的animal.nome属性一起使用。代码下方:

AnimalListAdapter.kt

class AnimalListAdapter(animalList: List<AnimalModel>, internal var context: Context, private val callbacks: (Int) -> Unit): RecyclerView.Adapter<AnimalListAdapter.ViewHolder>() {

    private val mAnimalRepository = AnimalRepository(context)

    internal var animalList: List<AnimalModel> = ArrayList()
    init {
        this.animalList = animalList
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.content_animal_list, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val animal = animalList[position]

        println(animal)
        holder.nomeAnimal.text = animal.nome
        holder.serieAnimal.text = animal.serie.toString()
        holder.rgnAnimal.text = animal.rgn.toString()

        holder.editButton.setOnClickListener{
            val intent = Intent(context, CadastroAnimalActivity::class.java)
            intent.putExtra("edit", true)
            intent.putExtra("position", animal.idAnimal)
            context.startActivity(intent)
        }

        holder.deleteButton.setOnClickListener{
            val view = View.inflate(context, R.layout.dialog_confirm_delete_animal, null)

            val builder = AlertDialog.Builder(context)
            builder.setView(view)

            val dialog = builder.create()
            dialog.show()
            dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)

            view.confirm_delete_animal_button.setOnClickListener {
                mAnimalRepository.delete(animal)
                callbacks(position)
                dialog.dismiss()
            }
        }
    }

    override fun getItemCount(): Int {
        return animalList.size
    }

    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view){
        var nomeAnimal: TextView = view.nome_animal
        var serieAnimal: TextView = view.serie_animal
        var rgnAnimal: TextView = view.rgn_animal
        var deleteButton: Button = view.delete_animal_button
        var editButton: Button = view.edit_animal_button
    }
}

动物活动.kt

class AnimalActivity : AppCompatActivity() {

    //Iniciando RecyclerView
    var animalAdapter: AnimalListAdapter? = null
    var linearLayoutManager: LinearLayoutManager? = null

    //Iniciando o SQLite
    var animalList = ArrayList<AnimalModel>()
    var displayAnimalList = ArrayList<AnimalModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_animal_list)

        initView()

        open_cadastro_animal.setOnClickListener {
            val intent = Intent(this, CadastroAnimalActivity::class.java)
            startActivity(intent)
            finish()
        }
    }

    private fun deleteAdapter(position: Int){
        //Exclusão de cards
        displayAnimalList.removeAt(position)
        animalAdapter!!.notifyItemRemoved(position)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_item, menu)
        val item = menu!!.findItem(R.id.search_action)

        if (item != null){
            val searchView = item?.actionView as SearchView
            val editText = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
            editText.hint = "Pesquisa..."

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

                override fun onQueryTextChange(newText: String?): Boolean {
                    if (newText!!.isNotEmpty()){
                        displayAnimalList.clear()
                        val searchText = newText!!.lowercase(Locale.getDefault())

                        animalList.forEach {
                            if (it.nome.lowercase(Locale.getDefault()).contains(searchText)){
                                displayAnimalList.add(it)
                            }
                        }
                        recyclerview_animal.adapter!!.notifyDataSetChanged()
                    } else {
                        displayAnimalList.clear()
                        displayAnimalList.addAll(animalList)
                        recyclerview_animal.adapter!!.notifyDataSetChanged()
                    }
                    return true
                }
            })
        }
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return super.onOptionsItemSelected(item)
    }

    private fun initView() {
        val mAnimalRepository = AnimalRepository(this)
        val mCategoriaRepository = CategoriaRepository(this)
        val mPelagemRepository = PelagemRepository(this)
        val mRacaRepository = RacaRepository(this)
        val mUfRepository = UfRepository(this)

        mCategoriaRepository.inicializa()
        mPelagemRepository.inicializa()
        mRacaRepository.inicializa()
        mUfRepository.inicializa()

        animalList = ArrayList(mAnimalRepository.getAll())
        displayAnimalList.addAll(animalList)

        animalAdapter = AnimalListAdapter(displayAnimalList, this, this::deleteAdapter)
        linearLayoutManager = LinearLayoutManager(this)

        //Inicialização da lista de Cards de fazendas cadastradas
        recyclerview_animal.layoutManager = linearLayoutManager
        recyclerview_animal.adapter = animalAdapter

    }
}

菜单项.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/search_action"
        android:title="Pesquisar"
        android:icon="@drawable/ic_outline_search_24"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

标签: androidkotlinandroid-recyclerviewandroid-menuandroid-search

解决方案


推荐阅读