首页 > 解决方案 > 如何使用 kotlin 向 RecyclerViewAdapter 添加过滤器?

问题描述

我想向这个 RecyclerViewAdapter 添加一个过滤器,请在这段代码中提供帮助

注意:我使用一个类来填充列表,这个类将四个参数作为输入(三个字符串和一个图像(Int))。

like the following example : 

            booksList.add(Book("The Wild Robot", "A 2 Categorie Book", "Description book", R.drawable.thewildrobot))
        booksList.add(Book("Maria Semples", "Categorie Book", "Description book", R.drawable.mariasemples))

RecyclerView 适配器

import android.content.Intent
import android.support.v7.widget.CardView
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import kotlin.collections.ArrayList


@Suppress("UNREACHABLE_CODE")
class RecyclerViewAdapter(private val mContext: List_of_Books, private val mData: MutableList<Book>) : RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>() {
    private var mFilteredList: MutableList<Book>? = null


   init {
        mFilteredList = mData
    }
    override fun getItemCount(): Int {
        return mData.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val view: View
        val mInflater = LayoutInflater.from(mContext)
        view = mInflater.inflate(R.layout.cardveiw_item_book, parent, false)
        return MyViewHolder(view)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        holder.tv_book_title.text = mData[position].getTitle()
        holder.img_book_thumbnail.setImageResource(mData[position].thumbnail)
        holder.cardView.setOnClickListener {
            val intent = Intent(mContext, Book_Activity::class.java)

            // passing data to the book activity
            intent.putExtra("Title", mData[position].getTitle())
            intent.putExtra("Description", mData[position].description)
            intent.putExtra("Thumbnail", mData[position].thumbnail)
            intent.putExtra("Category", mData[position].category)


            // start the activity
            mContext.startActivity(intent)
        }
    }

    fun setfilter(listitem: MutableList<Book>): MutableList<Book>? {
    mFilteredList!!.clear()
    /*mFilteredList = ArrayList()*/
    mFilteredList!!.addAll(listitem)
    notifyDataSetChanged()
    return mFilteredList
}


    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        internal var tv_book_title: TextView = itemView.findViewById(R.id.book_title_id) as TextView
        internal var img_book_thumbnail: ImageView = itemView.findViewById(R.id.book_img_id) as ImageView
        internal var cardView: CardView = itemView.findViewById(R.id.cardview_id) as CardView

    }


}

当我在 EdiText 中写入时,什么都没有改变,我将这段代码用于 Editext:

    fun filter(pl: MutableList<Book>, query: String): MutableList<Book> {
        var query = query
        query = query.toLowerCase()
        val filteredModeList = ArrayList<Book>()
        for (model in pl) {
            val text = model.getTitle()!!.toLowerCase()
            if (text.startsWith(query) || (text.contains(query))) {
                filteredModeList.add(model)
            }
        }
        return filteredModeList
    }
    val editText = findViewById<EditText>(R.id.editText)
    editText.hint = getString(R.string.Search_here)

    editText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(p0: Editable?) {
           val filtermodelist = filter(booksList, p0.toString())
            myAdapter.setfilter(filtermodelist)

        }

        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {

        }

        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {

        }
    })

书课

import com.medanis.fneclisbooks.R.attr.title
import com.medanis.fneclisbooks.R.string.category
import com.medanis.fneclisbooks.R.string.description
import java.util.ArrayList
import kotlin.reflect.KMutableProperty1
import android.R.attr.name



class Book(title: String, category: String, description: String, var thumbnail: Int) {

    private var title: String? = title
    var category: String? = category
    var description: String? = description

    fun getTitle(): String? {
        return title
    }

    fun setTitle(title: String) {
        this.title = title
    }}

我认为问题出在适配器中的过滤器中,那里有问题,请帮助我修复它

请帮助我,如果您需要更多信息,请在评论中告诉我。

标签: androidandroid-studiofilterandroid-recyclerviewkotlin

解决方案


推荐阅读