Il a été emballé pendant environ 2 mois, donc un mémorandum
IDE:Android Studio 3.4 Langue: Java
Xperia XZ3 (utilisé pour le débogage réel de la machine) Le système d'exploitation est Android 9 (niveau d'API 28)
Empêchez CheckBox dans ListView de changer son état de vérification en faisant défiler.
Dans la méthode getView, qui traite les éléments affichés dans ListView, collez à nouveau l'écouteur de CheckBox de ListView et dans la méthode onCheckedChanged, utilisez la position de l'argument getView pour récupérer à nouveau l'élément.
Bien que cela ne soit pas indiqué dans le code ci-dessous ArrayAdapter <type de classe à afficher dans ListView> s'étend, J'utilise le modèle ViewHolder.
Voici un exemple réussi.
ListAdapter.java
//ListItem est une classe d'éléments créés par l'utilisateur à afficher dans ListView.
private ListItem item;
//Omis ~~~~~~~~~~~~
public View getView (final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        //S'il n'y a rien dans convertView, créez-en un nouveau.
        convertView = mInflater.inflate(mResId, parent, false);
        //Obtenez les éléments de chaque élément de la liste.
        holder = new ViewHolder();
        holder.isActive = convertView.findViewById(R.id.alarm_active);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    //Obtient une instance de l'élément à afficher dans la vue de liste.
    item = getItem(position);
    //Décollez l'auditeur.
    holder.isActive.setOnCheckedChangeListener(null);
    //Objet obtenu à partir de la position sur l'élément(Instance de classe homebrew)À l'élément.
    holder.isActive.setChecked(item.isActive());
    //Collez l'auditeur.
    holder.isActive.setOnCheckedChangeListener(
        new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged (CompoundButton cb, boolean isChecked) {
                ListItem listItem = getItem(position);
                //Null check for warning
                if (listItem != null){
                    listItem.setActive(isChecked);
                }
            }
        });
    return convertView;
}
L'important ici est dans la méthode ** onCheckedChanged ** dans la classe anonyme
ListItem listItem = getItem(position);
C'est un processus appelé.
Ce processus doit refléter le statut de la vérification dans l'élément de liste (classe auto-fabriquée),
Supprimez cette partie simplement parce que c'est déjà fait comme ʻitem = getItem (position);  Si vous faites quelque chose comme ʻitem.setActive (isChecked);, cela ne fonctionnera pas correctement.
Recommended Posts