通过在 Kotlin 的 PopupWindow 中按下按钮来过滤 Recycler 查看内容

Filter Recycler View content by pressing button in PopupWindow in Kotlin

您好,我为出售房屋制作了 «anuncios» 的回收视图,我想创建一个过滤器,方法是在弹出窗口 window 中按下一个按钮,它将根据该参数过滤数据(例如,这个弹窗中有4个按钮window(1卧室,2卧室,3+卧室,全部),当我按下每个按钮时,它会出现在recycler视图中对应的数据。

我知道如何创建弹出窗口 window,但是,我正在努力寻找更改回收站视图中数据的最佳方法,具体取决于按下的过滤器按钮

我在 Android 中使用 Retrofit2,在网络服务器部分我使用 Notorm 和 Slim 4

我的适配器

class AnuncioAdapter(val anuncios: List<Anuncio>): RecyclerView.Adapter<AnunciosViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnunciosViewHolder {

        val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerline, parent, false)
        return AnunciosViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: AnunciosViewHolder, position: Int) {
        return holder.bind(anuncios[position])
    }
}

class AnunciosViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){
    private val morada: TextView = itemView.findViewById(R.id.morada)
    private val telemovel:TextView = itemView.findViewById(R.id.number)
    private val fotografia: ImageView = itemView.findViewById(R.id.image)

    fun bind(anuncio: Anuncio) {
        morada.text = anuncio.morada
        telemovel.text = anuncio.telemovel

        Picasso.with(itemView.getContext())
            .load(anuncio.fotografia)
            .into(fotografia);
    }

}

我的数据class

data class Anuncio(

    val address: String,
    val mobile: String,
    val qrcode: String,
    val latitude: Float,
    val longitude: Float,
    val n_bedrooms: Int,
    val n_bathrooms: Int,
    val picture: String,
    val price: Float,
    val furniture: String,
    val other_attr: String,
    val users_id: Int,
)

我的端点(我仍然只有 2 个。一个显示所有 anuncios,默认情况下正确显示,一个用于 1 间卧室,用于在处理其他卧室之前进行测试)

interface EndPoints {



    @GET("/RoomForStudents/api/anuncios")
    fun getAnuncios(): Call<List<Anuncio>>

    @GET("/RoomForStudents/api/anuncios_t1")
    fun getAnuncios_t1(): Call<List<Anuncio>>

我的主要activity

class ListaAnuncios : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lista_anuncios)

        setTitle(R.string.find)

        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)

        val request = ServiceBuilder.buildService(EndPoints::class.java)
        val call = request.getAnuncios()

        call.enqueue(object : Callback<List<Anuncio>> {
            override fun onResponse(call: Call<List<Anuncio>>, response: Response<List<Anuncio>>) {
                if (response.isSuccessful){
                    recyclerView.apply {
                        setHasFixedSize(true)
                        layoutManager = LinearLayoutManager(this@ListaAnuncios)
                        adapter = AnuncioAdapter(response.body()!!)
                    }
                }
            }
            override fun onFailure(call: Call<List<Anuncio>>, t: Throwable) {
                Toast.makeText(this@ListaAnuncios, "${t.message}", Toast.LENGTH_LONG).show()
            }
        }) }

编辑:我还将添加我的 Service Builder



    private val client = OkHttpClient.Builder().build()

    private val retrofit = Retrofit.Builder()
        .baseUrl("https://tneveda.000webhostapp.com")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    fun<T> buildService(service: Class<T>): T {
        return retrofit.create(service)
    }

我无法理解你的数据class,因为它不是英文的。 但是,一般意义上, 在弹出的点击事件 window 中,从您的适配器获取当前列表,或者您可以获取您在适配器参数中解析的列表,使用

过滤所需的卧室数量
val newList = anuncios.filter{
//your condition for checking the number of bedrooms
}

然后在适配器中重新提交该 newList 并在适配器上调用 notifyDataSetChanged()。