通过在 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()。
您好,我为出售房屋制作了 «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()。