Nicholas Spektor
Nicholas Spektor

Reputation: 13

How to clear a ListView that fetches elements from an API when I come back to the activity

So from the ActionActivity, I can start the ListeRecette activity. In the ListeRecette activity, when I click on btnRechercher, it will fill the ListView with elements thanks to an API GET. But when I finish the ListeRecette activity by pressing btnRetour, then start it again from the ActionActivity, the ListView still displays elements and when I click on one of them, it gives me:

FATAL EXCEPTION: main Process: com.example.chefchatter, PID: 8171 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:437) at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:394) at com.example.chefchatter.activites.ListeRecette$1.onItemClick(ListeRecette.java:96) at android.widget.AdapterView.performItemClick(AdapterView.java:330) at android.widget.AbsListView.performItemClick(AbsListView.java:1257) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3270) at android.widget.AbsListView$3.run(AbsListView.java:4236) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

So, I want to ensure that when I start the ListeRecette activity again, that the ListView is empty and doesn't hold any elements for us to click.

package com.example.chefchatter.activites;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chefchatter.R;
import com.example.chefchatter.activites.ListeRecette;
import com.example.chefchatter.modele.Compte;
import com.example.chefchatter.presentateur.PresentateurCompte;

public class ActionActivity extends AppCompatActivity implements View.OnClickListener{
    private TextView tvBonjour;
    private ImageButton imgBtnHome;
    private Button btnDeconnexion;
    private  Button btnParcourirRecettes;
    private Button btnModifierCompte;

    private Button btnFavoris;
    private Compte compte;
    private PresentateurCompte presentateurCompte;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_action);

        tvBonjour = findViewById(R.id.tvBonjour);
        btnDeconnexion = findViewById(R.id.btnDeconnexion);
        btnParcourirRecettes = findViewById(R.id.btnParcourirRecettes);
        btnModifierCompte = findViewById(R.id.btnModifierCompte);
        btnFavoris = findViewById(R.id.btnParcourirFavoris);

        btnDeconnexion.setOnClickListener(this);
        btnParcourirRecettes.setOnClickListener(this);
        btnModifierCompte.setOnClickListener(this);
        btnFavoris.setOnClickListener(this);

        presentateurCompte = new PresentateurCompte(this);

    }
    protected void onResume() {
        super.onResume();
        compte = presentateurCompte.getCompte();
        if (compte != null) {
            String nomUtilisateur = compte.getNomUtilisateur();
            String messaqeBienvenue = getResources().getString(R.string.bonjour, nomUtilisateur);
            tvBonjour.setText(messaqeBienvenue);
        }
    }


    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btnDeconnexion){
            finish();
        }
        else if(v.getId() == R.id.btnParcourirRecettes){
            Intent intent = new Intent(this, ListeRecette.class);
            startActivity(intent);
        }
        else if(v.getId() == R.id.btnModifierCompte){

            Intent intent = new Intent(this, ModifierCompteActivity.class);
            startActivity(intent);
        }
        else if(v.getId() == R.id.btnParcourirFavoris){
            Intent intent = new Intent(this, ListeFavorisActivity.class);
            startActivity(intent);
        }
    }
}
package com.example.chefchatter.activites;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.chefchatter.dao.RecettesCallback;
import com.example.chefchatter.modele.Filtre;
import com.example.chefchatter.R;
import com.example.chefchatter.modele.Recette;
import com.example.chefchatter.presentateur.AdapteurRecette;
import com.example.chefchatter.presentateur.IngredientsAdapter;
import com.example.chefchatter.presentateur.PresentateurRecette;

import java.util.List;

public class ListeRecette extends AppCompatActivity implements View.OnClickListener{

    private Button btnRetour;
    private Button btnRechercher;

    private ListView listeRecette;

    private Spinner origine;
    private Spinner regime;
    private Spinner type;
    PresentateurRecette presentateurRecette;
    List<Recette> recettes;
    private AdapteurRecette adaptateur;
    private EditText txtIngredient;

    private Filtre filtre = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_liste_recette);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        origine = findViewById(R.id.sChoixOrigine);
        regime = findViewById(R.id.sChoixRegime);
        type = findViewById(R.id.sChoixType);

        ArrayAdapter<CharSequence> adapterOrigine = ArrayAdapter.createFromResource(this, R.array.spinner_choice_origine, android.R.layout.simple_spinner_item);
        adapterOrigine.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        origine.setAdapter(adapterOrigine);

        ArrayAdapter<CharSequence> adapterRegime = ArrayAdapter.createFromResource(this, R.array.spinner_choice_regime, android.R.layout.simple_spinner_item);
        adapterRegime.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        regime.setAdapter(adapterRegime);

        ArrayAdapter<CharSequence> adapterType = ArrayAdapter.createFromResource(this, R.array.spinner_choice_type, android.R.layout.simple_spinner_item);
        adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        type.setAdapter(adapterType);

        listeRecette = findViewById(R.id.lvFiltre);

        btnRechercher = findViewById(R.id.btnRecherche);
        btnRechercher.setOnClickListener(this);

        btnRetour = findViewById(R.id.btnRet);
        btnRetour.setOnClickListener(this);

        presentateurRecette = new PresentateurRecette(this);

        adaptateur = new AdapteurRecette(this,
                R.layout.layout_recettes,presentateurRecette);
        listeRecette.setAdapter(adaptateur);

        txtIngredient = findViewById(R.id.etListeIngredients);

        listeRecette.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent iRecetteDescription = new Intent(getApplicationContext(), DescriptionRecette.class);
                    Recette recetteSelectionnee = (Recette) parent.getAdapter().getItem(position);
                    String src = recetteSelectionnee.getSrc();
                    String nom = recetteSelectionnee.getNom();
                    //ajouter mots clefs
                    Integer idRecette = recetteSelectionnee.getId();
                    String tempsCuisson = recetteSelectionnee.getCuisson();
                    String tempsPreparation = recetteSelectionnee.getPreparation();
                    String portions = recetteSelectionnee.getPortion();
                    String description = recetteSelectionnee.getDescription();
                    String origine = recetteSelectionnee.getOrigine();
                    String regime = recetteSelectionnee.getRegime();
                    String type = recetteSelectionnee.getType();
                    String etape = recetteSelectionnee.getEtape();
                    iRecetteDescription.putExtra("ID", idRecette);
                    iRecetteDescription.putExtra("SRC", src);
                    iRecetteDescription.putExtra("NOM", nom);
                    iRecetteDescription.putExtra("TEMPS_CUISSON", tempsCuisson);
                    iRecetteDescription.putExtra("TEMPS_PREPARATION", tempsPreparation);
                    iRecetteDescription.putExtra("PORTIONS", portions);
                    iRecetteDescription.putExtra("DESCRIPTION", description);
                    iRecetteDescription.putExtra("ORIGINE", origine);
                    iRecetteDescription.putExtra("REGIME", regime);
                    iRecetteDescription.putExtra("TYPE", type);
                    iRecetteDescription.putExtra("ETAPES", etape);
                    startActivity(iRecetteDescription);

            }
        });
    }

    @Override
    public void onClick(View v) {
        if(v == btnRetour){
            finish();
        }
        else if(v == btnRechercher){

            String[] ingredientsListe = txtIngredient.getText().toString().split(",");
            String[] origineValues = getResources().getStringArray(R.array.spinner_choice_origine_values);
            String[] regimeValues = getResources().getStringArray(R.array.spinner_choice_regime_values);
            String[] typeValues = getResources().getStringArray(R.array.spinner_choice_type_values);

            String origine = this.origine.getSelectedItemPosition() == 0 ? "" : origineValues[this.origine.getSelectedItemPosition()];
            String regime = this.regime.getSelectedItemPosition() == 0 ? "" : regimeValues[this.regime.getSelectedItemPosition()];
            String type = this.type.getSelectedItemPosition() == 0 ? "" : typeValues[this.type.getSelectedItemPosition()];

            filtre = new Filtre(origine, regime, type, ingredientsListe);
            presentateurRecette.obtenirRecettes(filtre ,new RecettesCallback() {
                @Override
                public void onRecettesReceived(List<Recette> recettes) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ListeRecette.this.recettes = presentateurRecette.getRecettes();
                            adaptateur.clear();
                            adaptateur.addAll(recettes);
                            raffraichirListe();
                        }
                    });

                }

            });

    }
 }

    public void raffraichirListe() {
        this.adaptateur.notifyDataSetChanged();
        Toast.makeText(this,adaptateur.getCount()+" recettes retrouvées",Toast.LENGTH_SHORT).show();
    }


    @Override
    protected void onResume() {
        super.onResume();
        // Initialize the adapter if null
        if (adaptateur == null) {
            adaptateur = new AdapteurRecette(this, R.layout.layout_recettes, presentateurRecette);
            listeRecette.setAdapter(adaptateur);
        } else {
            adaptateur.clear();
            adaptateur.notifyDataSetChanged();
        }
    }

//    @Override
//    protected void onResume() {
//        super.onResume();
//        int r = checkSelfPermission("android.permission.INTERNET");
//        if (r == PackageManager.PERMISSION_GRANTED) {
//            //    Toast.makeText(this, "Accès Internet permis!", Toast.LENGTH_LONG).show();
//            this.presentateurRecette.obtenirRecettes(filtre, new RecettesCallback() {
//                @Override
//                public void onRecettesReceived(List<Recette> recettes) {
//                    runOnUiThread(new Runnable() {
//                        @Override
//                        public void run() {
//                            ListeRecette.this.recettes = presentateurRecette.getRecettes();
//                            adaptateur.clear();
//                            adaptateur.addAll(recettes);
//                            raffraichirListe();
//                        }
//                    });
//
//                }
//            }
//            );
//        } else {
//            Toast.makeText(this, "Accès Internet non permis!", Toast.LENGTH_LONG).show();
//        }
//    }
}
package com.example.chefchatter.presentateur;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.bumptech.glide.Glide;
import com.example.chefchatter.R;
import com.example.chefchatter.modele.Recette;

public class AdapteurRecette extends ArrayAdapter {
    private Context contexte;
    private int viewResourceId;
    private Resources resources;
    private PresentateurRecette presentateur;
    public AdapteurRecette(@NonNull Context context, int resource, PresentateurRecette presentateur) {
        super(context, resource);
        this.contexte = context;
        this.viewResourceId = resource;
        this.resources = contexte.getResources();
        this.presentateur = presentateur;
    }



    @Override
    public int getCount() {
        return this.presentateur.getNbRecettes();
    }
    @SuppressLint("NewApi")
    @NonNull
    @Override
    public View getView(int position, @Nullable View view, @NonNull ViewGroup parent) {

        if (view == null) {
            LayoutInflater layoutInflater = (LayoutInflater) contexte.getSystemService(Context.
                    LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(this.viewResourceId, parent, false);
        }
        final Recette recette = this.presentateur.getRecette(position);
        if (recette != null) {
            final TextView tvNomRecette = (TextView) view.findViewById(R.id.lrTvNomRecette);
            final TextView tvPrenomChef = (TextView) view.findViewById(R.id.lrTvPrenomChef);
            final ImageView imageRecette = (ImageView) view.findViewById(R.id.lrIvPhoto);

            tvNomRecette.setText(String.format("Nom de la recette: %s", recette.getNom()));
            tvPrenomChef.setText(String.format("Chef: %s", recette.getPrenom()));
            Glide.with(this.contexte)
                    .load(recette.getSrc())
                    .into(imageRecette);
        }
        return view;
    }

}

Thank you.

Upvotes: 0

Views: 30

Answers (1)

kpwn Apps
kpwn Apps

Reputation: 602

change it to this:

else if(v.getId() == R.id.btnParcourirRecettes){
            Intent intent = new Intent(this, ListeRecette.class);
            finish();
            startActivity(intent);
        }

Upvotes: 0

Related Questions