Hallo, ich habe eine Recycler-Ansicht von «Anuncios» für den Verkauf von Häusern erstellt, und ich möchte einen Filter erstellen, indem ich eine Schaltfläche in einem Popup-Fenster drücke, der die Daten basierend auf diesem Parameter filtert (z. B. gibt es 4 Schaltflächen in dieses Popup-Fenster (1 Schlafzimmer, 2 Schlafzimmer, 3+ Schlafzimmer, alle), und wenn ich jede Taste drücke, erscheinen in der Recycler-Ansicht die entsprechenden Daten.
Ich weiß, wie man das Popup-Fenster erstellt, aber ich habe Schwierigkeiten, den besten Ansatz zum Ändern der Daten in meiner Recycler-Ansicht zu finden, abhängig von der gedrückten Filterschaltfläche
Ich verwende Retrofit2 in Android und im Webserver-Teil verwende ich Nonorm und Slim 4
Mein Adapter
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);
}
}
Meine Datenklasse
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,
)
Meine Endpunkte (ich habe immer noch nur 2. den, der alle Ankündigungen anzeigt und standardmäßig korrekt anzeigt, und den für 1 Schlafzimmer, zu Testzwecken, bevor ich an den anderen arbeite)
interface EndPoints {
@GET("/RoomForStudents/api/anuncios")
fun getAnuncios(): Call<List<Anuncio>>
@GET("/RoomForStudents/api/anuncios_t1")
fun getAnuncios_t1(): Call<List<Anuncio>>
Meine Haupttätigkeit
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()
}
}) }
Bearbeiten: Ich werde auch meinen Service Builder hinzufügen
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)
}
Lösung des Problems
Ich kann Ihre Datenklasse nicht verstehen, da sie nicht auf Englisch ist. Aber im Allgemeinen erhalten Sie beim Klicken auf ein Ereignis im Popup-Fenster die aktuelle Liste von Ihrem Adapter, oder Sie können die Liste abrufen, die Sie im Parameter des Adapters analysiert haben, und sie mit der erforderlichen Anzahl von Schlafzimmern filtern
val newList = anuncios.filter{
//your condition for checking the number of bedrooms
}
Übergeben Sie dann diese newList im Adapter erneut und rufen Sie notificationDataSetChanged() für den Adapter auf.
Keine Kommentare:
Kommentar veröffentlichen