2

J'ai un problème, je ne comprends pas pourquoi mes CardViews ont cet effet.Android Adaptateur ne fonctionne pas lors de la sélection de plusieurs vues de cartes

J'ai besoin de sélectionner un ou plusieurs CardViews mais mon adaptateur ne fonctionne pas correctement. Ma mise en œuvre de l'adaptateur est-elle incorrecte?

enter image description here

Mon adaptateur

public class PersonasAdapter extends RecyclerView.Adapter <PersonasAdapter.PersonasViewHolder> { 

private Persona subject; 
private List <Persona> personastList; 
public PersonasAdapter() {} 

public PersonasAdapter(List <Persona> personastList) { 
    this.personastList = personastList; 
} 


@Override 
public void onBindViewHolder(final PersonasViewHolder personasViewHolder, int i) { 
    Persona ci = personastList.get(i); 
    personasViewHolder.txtNombre.setText(ci.getNombre()); 
    personasViewHolder.txtUsuario.setText(ci.getUsuario()); 
    personasViewHolder.txtTwitter.setText(ci.getTwitter()); 
    subject = personastList.get(i); 

    personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 
    Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show(); 
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 
    return false; 
    } 
    }); 
    personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show(); 
    } 
    }); 
} 
@Override 
public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false); 
    cardView 
    return new PersonasViewHolder(itemView); 
} 

Classe statique

public static class PersonasViewHolder extends RecyclerView.ViewHolder { 
     protected TextView txtNombre; 
     protected TextView txtUsuario; 
     protected TextView txtTwitter; 
     protected CardView card_view; 

     public PersonasViewHolder(View v) { 
     super(v); 
     txtNombre = (TextView) v.findViewById(R.id.txtNombre); 
     txtUsuario = (TextView) v.findViewById(R.id.txtUsuario); 
     txtTwitter = (TextView) v.findViewById(R.id.txtTwitter); 
     card_view = (CardView) v.findViewById(R.id.card_view); 
     } 
    } 
    //Metodo que nos retornarta la cantidad de personas en la lista 
    @Override 
    public int getItemCount() { 
     return personastList.size(); 
    } 
    } 

Répondre

0

J'ai résolu mon problème. Le problème est la position de la cardview.

Je déclare la variable globale

int globalPosition; 

et

personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() { 
@Override 
public boolean onLongClick(View v) { 
Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show(); 



personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 
      globalPosition=i; 
      notifyDataSetChanged(); 
      return false; 
     } 
    }); 

et une validation dans

et si onBindViewHolder

if (i == globalPosition) { 
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 
} else { 
    personasViewHolder.card_view.setBackgroundResource(R.color.colorAccent); 
} 

et le résultat, il est cela.

public class PersonasAdapter extends RecyclerView.Adapter <PersonasAdapter.PersonasViewHolder> { 

private Persona subject; 
private List <Persona> personastList; 
public PersonasAdapter() {} 
int globalPosition; 

public PersonasAdapter(List <Persona> personastList) { 
this.personastList = personastList; 
} 


@Override 
public void onBindViewHolder(final PersonasViewHolder personasViewHolder, final int i) { 
Persona ci = personastList.get(i); 
personasViewHolder.txtNombre.setText(ci.getNombre()); 
personasViewHolder.txtUsuario.setText(ci.getUsuario()); 
personasViewHolder.txtTwitter.setText(ci.getTwitter()); 
subject = personastList.get(i); 


personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() { 

@Override 
public boolean onLongClick(View v) { 
Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show(); 
personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 
globalPosition=i; 
notifyDataSetChanged(); 
return false; 
} 
}); 
personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show(); 
} 
}); 



if(i==globalPosition) 
{ 
//change color like 
personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 


} 
else 
{ 
personasViewHolder.card_view.setBackgroundResource(R.color.colorAccent); 
} 

} 
@Override 
public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false); 

return new PersonasViewHolder(itemView); 
} 
public static class PersonasViewHolder extends RecyclerView.ViewHolder { 
protected TextView txtNombre; 
protected TextView txtUsuario; 
protected TextView txtTwitter; 
protected CardView card_view; 

public PersonasViewHolder(View v) { 
super(v); 
txtNombre = (TextView) v.findViewById(R.id.txtNombre); 
txtUsuario = (TextView) v.findViewById(R.id.txtUsuario); 
txtTwitter = (TextView) v.findViewById(R.id.txtTwitter); 
card_view = (CardView) v.findViewById(R.id.card_view); 
} 
} 
//Metodo que nos retornarta la cantidad de personas en la lista 
@Override 
public int getItemCount() { 
return personastList.size(); 
} 
} 
+0

Salut, regarde bien. Mais c'est incroyable pour moi que presque chaque article/blog sur RecyclerViews se concentre sur la création d'une liste, mais aucun sur l'enregistrement de la liste. Il n'est pas bon de créer une liste magnifiquement conçue/précieuse (disons une grande liste de chansons que je veux télécharger) et ensuite avoir la liste littéralement détruite si je m'éloigne de la liste avec la simple pression du bouton de retour. Pourquoi l'enregistrement du code d'état ne serait-il pas nécessaire pour créer chaque liste RecyclerView comme les autres exigences: l'adaptateur, le gestionnaire de disposition, onCreateViewHolder, onBindViewHolder et getItemCount? Pensées? – AJW

0

Le problème est le suivant:

  • Vous effectuez un clic long sur le premier PersonasViewHolder de votre liste.
  • Puis, dans votre onLongClickListener, vous modifiez la couleur d'arrière-plan de ce support.
  • Mais ce support est ensuite réutilisé pour des positions ultérieures dans la vue recycleur, donnant la sensation que l'arrière-plan est répété dans les éléments suivants.

Vous pouvez le réparer en stockant l'état de chaque cardview dans un tableau, puis en liant la couleur correcte pour chaque position. J'ai modifié votre code pour montrer cette idée:

public class PersonasAdapter extends RecyclerView.Adapter <PersonasAdapter.PersonasViewHolder> { 

private Persona subject; 
private List <Persona> personastList; 
private boolean[] selectedPersonas; 
public PersonasAdapter() {} 

public PersonasAdapter(List <Persona> personastList) { 
    this.personastList = personastList; 
    this.selectedPersonas = new boolean[personasList.size()]; 
    for (int i = 0; i < personasList.size(); i++) { 
     this.selectedPersonas[i] = false; 
    } 
} 

@Override 
public void onBindViewHolder(final PersonasViewHolder personasViewHolder, final int i) { 
    Persona ci = personastList.get(i); 
    personasViewHolder.txtNombre.setText(ci.getNombre()); 
    personasViewHolder.txtUsuario.setText(ci.getUsuario()); 
    personasViewHolder.txtTwitter.setText(ci.getTwitter()); 
    subject = personastList.get(i); 

    updatePersonaHolderBackground(personaViewHolder, i); 

    personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 
    Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show(); 
    selectedPersonas[i] = !selectedPersonas[i]; 
    updatePersonaHolderBackground(personaViewHolder, i); 
    return false; 
    } 
    }); 
    personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show(); 
    } 
    }); 
} 
@Override 
public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false); 
    cardView 
    return new PersonasViewHolder(itemView); 
} 

private void updatePersonaHolderBackground(final PersonasViewHolder personasViewHolder, final int i) { 
    if (selectedPersonas[i]) { 
      personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary); 
    } else { 
      // TODO: change the color of personasViewHolder back to normal using whatever color you want. 
    } 
} 
+0

mais ne fonctionne pas:/ –

+0

Qu'est-ce qui ne fonctionne pas? A-t-il le même comportement qu'avant? Avez-vous changé le TODO avec la bonne couleur? – FlyingPumba