Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] ListView : Item A affecte item B

Sujet résolu
    19 janvier 2017 à 14:54:31

    Bonjour tous le monde, 

    J'ai fais une petite ListView et chacun de mes item affecte un item dans la listView. Je crois comprendre que c'est en rapport avec la position de l'élement qui change... en fonction du scrolling ? Par exemple dans le screen que je vais vous montrer l'item à la position 0 va affecté un item plus bas.

    Bizarre ? :o

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2017 à 18:33:42

      Salut,

      C'est un comportement normal. Pour gérer les listes, il y a une notion de recyclage. Lorsque ta vue n'est plus visible à l'écran, le système la réutilise. Par conséquent, tu hérites du précédent état. Si tu ne souhaites rien afficher dans ton textView, il convient soit de lui setter un texte vide, soit de la cacher en changeant sa visibilité.

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2017 à 0:40:37

        Salut @rolandl et merci pour ta réponse claire. Mais comment lui setter un textView vide quand le systeme réutilise la vue ? Pour être plus clair dans ma questionn, Chaque éléments à une position donc y'a t-il un moyen pour que je puisse détecter un changement de vue ?

        Merci encore

        Edit : 

        @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                final ViewHolder holder;
                if(convertView == null){
                    holder = new ViewHolder();
                    convertView = inflater.inflate(R.layout.fragment_filtre, null);
                    holder.myEditText = (EditText) convertView.findViewById(R.id.contentEdit);
                    holder.myTextView = (TextView) convertView.findViewById(R.id.contentText);
                    convertView.setTag(holder);
                }else{
                    holder = (ViewHolder) convertView.getTag();
                }
                final String filtre = lesFiltres.get(position).getFiltre();
                final String[] specifications = lesFiltres.get(position).getSpecification().split(",");
                holder.myTextView.setText(filtre);
                ...
                //Code évenement du clic avec AlertDialog
                ...
                }
        return convertView;
        }



        -
        Edité par Brokk 20 janvier 2017 à 10:42:12

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2017 à 16:53:25

          Salut,

          Peux-tu montrer le code complet de la fonction getView pour que je puisse voir comment tu affiches les "specifications" ?

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2017 à 17:44:36

             @Override
                public View getView(final int position, View convertView, ViewGroup parent) {
                    holder = null;
                    if(convertView == null){
                        holder = new ViewHolder();
                        convertView = inflater.inflate(R.layout.fragment_filtre, null);
                        holder.myEditText = (EditText) convertView.findViewById(R.id.contentEdit);
                        holder.myTextView = (TextView) convertView.findViewById(R.id.contentText);
                        convertView.setTag(holder);
                    }else{
                        holder = (ViewHolder) convertView.getTag();
                    }
                    final String filtre = lesFiltres.get(position).getFiltre();
                    final String[] specifications = lesFiltres.get(position).getSpecification().split(",");
                    holder.myTextView.setText(filtre);
                    holder.myEditText.setEnabled(false);
                    holder.myTextView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
            
                            AlertDialog.Builder builder = new AlertDialog.Builder(context);
                            if(!selectedType.isEmpty()){
                                selectedType.clear();
                            }
                            builder.setTitle(filtre)
                                    .setMultiChoiceItems(specifications, null, new DialogInterface.OnMultiChoiceClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int position, boolean isChecked) {
                                            if(isChecked){
                                                selectedType.add(specifications[position]);
                                            }else{
                                                if(selectedType.contains(specifications[position])){
                                                    selectedType.remove(specifications[position]);
                                                }
                                            }
                                        }
                                    })
                                    .setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            return;
                                        }
                                    })
                                    .setPositiveButton("Sauvegarder", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            String value = "";
                                            for(String type : selectedType){
                                                value += type+" ,";
                                            }
                                            holder.myEditText.setText(value);
                                        }
                                    });
                            Dialog dialog = builder.create();
                            dialog.show();
                        }
                    });
                    return convertView;
                }

            C'est ce que tu voulais ? 

            Merci pour ton aide :)

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2017 à 14:31:25

              Salut,

              Il convient de faire, au niveau de la ligne 15 de ta méthode :

              holder.myEditText.setText("");
              
              • Partager sur Facebook
              • Partager sur Twitter
                22 janvier 2017 à 15:42:03

                @Rolandl Merci pour ton aide ! Je vais essayer ça

                Edit : @Rolandl j'ai essayé la méthode mais en mettant :

                 holder.myEditText.setText("");

                Chaque filtre que j'entre s'affiche sur la premiere ligne, par exemple en cliquant sur la surface j'ai une checkbox qui s'affiche et quand je coche la valeur "surface > 50", cette valeur s'affiche sur la ligne du filtre "Meublé/Non Meublé"

                Edit2 : J'ai finalement tout déplacer de la ListAdapter et je l'ai mis dans l'activity. j'ai créer cette fonction pour retourner modifier la ligne actuel :

                public void updateView(int index, String value){
                        View v = myList.getChildAt(index -
                                myList.getFirstVisiblePosition());
                
                        if(v == null) {
                            return;
                        }
                        TextView updatedText = (TextView) v.findViewById(R.id.contentEdit);
                        updatedText.setText(""+value);
                    }

                Là ça me donne aucun doublons. (Par contre quand je scroll et que je remonte la valeur à de l'item à disparu... je pense que je devrai la sauvegarder avec SavedInstanceState mais c'est un autre problème :D  tant que celui ci est réglé ! )

                -
                Edité par Brokk 23 janvier 2017 à 11:22:36

                • Partager sur Facebook
                • Partager sur Twitter

                [Android] ListView : Item A affecte item B

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown