[List] Remplir une ArrayList

Fermé
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020 - Modifié le 4 mai 2020 à 15:32
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020 - 5 mai 2020 à 18:41
Bonjour,

Je vous contact car je ne sais pas comment m'y prendre pour une liste d'éléments comprenant une image, un string , et un autre string. (J'ai fais comme cela mais ca ne fonctionne pas, mais ca n'affiche pas d'erreur pour autant..). De plus, je dois afficher un élément aléatoire de la liste, mais je trouve pas vraiment le moyen de parcourir la liste avec un random via l'index de la liste... Peut être pourrez m'aider.
public class Page1 extends AppCompatActivity {
 
 
    private ImageView Affiche ;
    private TextView Titre ;
    private TextView Description ;
 
    private Random r ;
 
    public List<FilmsC1> films;
 
    private Button Bouton ;
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page1);
 
        this.r = new Random();
 
        this.films = new ArrayList<FilmsC1>() ;
        FilmsC1 film1 = new FilmsC1(R.drawable.image_1 , "Titre 1" , "Description 1") ;
        FilmsC1 film2 = new FilmsC1(R.drawable.image_2 , "Titre 2" , "Description 2") ;
        FilmsC1 film3 = new FilmsC1(R.drawable.image_3 , "Titre 3" , "Description 3") ;
        FilmsC1 film4 = new FilmsC1(R.drawable.image_4 , "Titre 4" , "Description 4") ;
        FilmsC1 film5 = new FilmsC1(R.drawable.image_5 , "Titre 5" , "Description 5") ;
 
        films.add(film1);
        films.add(film2);
        films.add(film3);
        films.add(film4);
        films.add(film5);
 
 
 
        this.Affiche = (ImageView) findViewById(R.id.Affiche1) ;
        Affiche.setImageResource(film1.getAffiches());
 
        this.Titre = (TextView) findViewById(R.id.Titre1) ;
        Titre.setText(films.indexOf(film1.getTitres()));
 
        this.Description = (TextView) findViewById(R.id.Description1);
        Description.setText(films.indexOf(film1.getDescriptions()));
 
 
 
 
        this.Bouton = findViewById(R.id.buttonDejaVu);
        Bouton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent Retry = new Intent(getApplicationContext(), Page1.class);
                startActivity(Retry);
            }
        });
 
 
    }
}

Je vous remercie d'avance !
Configuration: Macintosh / Chrome 81.0.4044.129
A voir également:

3 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
4 mai 2020 à 16:54
Hello,

Difficile de t'aider avec un simple "ça ne fonctionne pas"... Néanmoins, il y a plusieurs choses qui ne vont pas forcément

film1.getAffiches()
Je m'attends à récupérer plusieurs affiches. C'est le cas ? Quel est le type de l'objet retour ? Un Drawable ? Un DrawableID ?

films.indexOf(film1.getTitres())
Même remarque, je m'attends à une liste. De plus, tu essaies de récupérer l'occurrence d'un objet à partir d'un objet d'un autre type. C'est comme si tu comparais des choux et des carottes.

Pour générer un nombre aléatoire, il faut utiliser
Random().nextInt(int bound)
, sachant que cette méthode va te générer un entier entre 0 et bound-1. Dans ton cas, tu peux utiliser ceci :

Random random = new Random();
int aleatoire = random.nextInt(films.size());
FilmC1 filmAleatoire = films.get(aleatoire);

affiche.setImageResource(filmAleatoire.getAffiche());
titre.setText(filmAleatoire.getTitre());
description.setText(filmAleatoire.getDescription());


Note : généralement, les noms de variable commencent par une minuscule
0
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020
Modifié le 4 mai 2020 à 21:38
Merci de la réponse !
film1.getAffiche recevra une seule image qui est un Drawable, film2 aura une autre image, et ainsi de suite. Je voudrais donc choisir d'afficher un film(r) ou r serait le random(). Pour cela j'avais déja utilisé Integer[] et Random().nextInt, mais cette méthode ne fonctionne pas avec les String[], or je pensais à utiliser un même random r pour parcourir 3 tableaux (un pour les images, un pour les titres et un pour les descriptions) comme s'en suit :

public class Page1 extends AppCompatActivity {
 
    private ImageView Affiche ;
    private TextView Titre ;
 
    private Random r ;
 
    private Integer[] affiches = {
            R.drawable.image_1,
            R.drawable.image_2,
            R.drawable.image_3,
            R.drawable.image_4,
            R.drawable.image_5,
    };
 
    private String titres[] = {
            "Titre 1",
            "Titre 2",
            "Titre 3",
            "Titre 4",
            "Titre 5",
    };

    private String descriptions[] = {
            "Description 1",
            "Description  2",
            "Description  3",
            "Description  4",
            "Description  5",
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page1);
 
        this.r = new Random();</span>
 
        this.Affiche =(ImageView)findViewById(R.id.Affiche1) ;
        Affiche.setImageResource(affiches[r.nextInt(affiches.length)]);
 
        this.Titre = (TextView) findViewById(R.id.Titre1) ;
        Titre.setText(titres[r.nextInt(   /* ??? */   )]); 

        this.Description = (TextView) findViewById(R.id.Description1);
        Description.setText(descriptions[r.nextInt( /* ??? */ )]);
    }
}

Je vous remercie d'avance !
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
4 mai 2020 à 21:37
Pour les données, il vaut mieux garder un objet Film qui stocke affiche, titre et description plutôt que 3 listes. Un jour, tu vas vouloir, par exemple, supprimer une affiche mais du coup, tes tableaux n'auront plus la même taille et tu vas crasher.

Si je comprends bien, tu veux afficher un film de manière aléatoire et non créer un pseudo film avec les infos d'autres films prises de manière aléatoire, non ? La méthode que je t'ai posté te permet de générer un seul chiffre aléatoire, entre 0 et le nombre de films dans ta liste. Là, tu vas piocher aléatoirement dans tes listes pour créer un film

0
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020
5 mai 2020 à 10:57
Ouais c'est exactement ca ! Mais le problème c'est que je ne vois pas par quel methode il faut passer pour faire parcourir un random dans la liste films ..
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894 > SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020
5 mai 2020 à 13:30
As-tu compris le code que je t'ai posté ? Je pense répondre à ton besoin. Je le remets, avec des commentaires

// stockage des films dans une liste
films = new ArrayList<FilmsC1>() ;

// génération d'un nombre aléatoire compris entre 0 et le nombre de films de ta liste
Random random = new Random();
int aleatoire = random.nextInt(films.size()+1);

// récupération du film correspondant
FilmC1 filmAleatoire = films.get(aleatoire);

// affichage des données
affiche.setImageResource(filmAleatoire.getAffiche());
titre.setText(filmAleatoire.getTitre());
description.setText(filmAleatoire.getDescription());


Dis-moi si quelque chose ne convient pas
0
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020
5 mai 2020 à 14:49
HA ! oui ok je comprends beaucoup mieux la fonction get ! Cependant j'ai toujours un problème, lorsque je lance l'appli et que j'arrive sur l'activité - Page1 - (celle ou est écrit ce code), ca me ramène à l'activité précédente, comme si le code comprenait toujours des erreurs. Je pense que cela est dût à ma manière de remplir ma liste de film, ou peut être à mon activité - FilmC1 - ... : Pour remplir ma liste j'ai tapé dan l'activité Page1 :


//Nouvelle Liste
this.films = new ArrayList<>();

FilmsC1 film1 = new FilmsC1(R.drawable.image_1 , "Titre 1" , "Description 1");
FilmsC1 film2 = new FilmsC1(R.drawable.image_2 , "Titre 2" , "Description 2");
FilmsC1 film3 = new FilmsC1(R.drawable.image_3 , "Titre 3" , "Description 3");


//Génération d'un entier aléatoire entre 0 et TaileListe
Random random = new Random();
int r = random.nextInt(films.size()+1) ; // ... Et le reste du code
.



Pour l'activité FilmC1 j'ai tapé :
 

class FilmsC1 {

private int affiches;
private String titres;
private String descriptions;

public int getAffiches() {
return affiches;
}

public String getTitres() {
return titres;
}

public String getDescriptions() {
return descriptions;
}

public FilmsC1(int paffiche, String ptitre, String pdescription) {
this.affiches = paffiche;
this.titres = ptitre;
this.descriptions = pdescription;



}
}


Encore merci de votre attention c'est gentil
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
5 mai 2020 à 17:03
Dans ton 1er bout de code, tu ne remplis pas ta liste ;)

N'hésites pas à regarder les Logs dans la fenêtre Logcat pour voir et comprendre ce qui cloche.
0
SuperGoldfish Messages postés 5 Date d'inscription lundi 4 mai 2020 Statut Membre Dernière intervention 5 mai 2020 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
5 mai 2020 à 18:41
Ok ca marche super merci !
0