Changement ListView fond - comportement étrange
J'ai un problème avec la modification de l'arrière-plan d'une vue dans une ListView.
Ce dont j'ai besoin:
Changer l'image de fond d'une ligne onClick()
Ce qui se passe réellement:
L'arrière-plan est changé (sélectionné) après appuyant, par exemple, la première entrée. Mais après le défilement en bas de la 8ème entrée est sélectionnée trop.
Revenir en haut de la première n'est pas sélectionné plus. La deuxième entrée est actuellement sélectionné.
Continuez à faire défiler et il continue à sauter...
Ce que je suis dong dans le Code:
J'ai canaux, et onClick (), je bascule un attribut de canal boolean sélectionné
puis-je changer l'arrière-plan.
Je suis en train de faire ce seulement onClick() c'est pourquoi je ne comprends pas pourquoi c'est actuelly qui se passe sur les autres entrées.
Une chose que je remarque est que Cela ne semble être que le "dessin"-en partie parce que l'élément qui se sélectionnée "par lui-même", a encore la sélectionné valeur sur faux
Je pense qu'il semble avoir quelque chose à voir avec la réutilisation de la vue dans la coutume ListAdapters getView(...)
Code de onClick() dans ListActivity:
@Override
protected ViewHolder createHolder(View v) {
//createHolder will be called only as long, as the ListView is not
//filled
TextView title = (TextView) v
.findViewById(R.id.tv_title_channel_list_adapter);
TextView content = (TextView) v
.findViewById(R.id.tv_content_channel_list_adapter);
ImageView icon = (ImageView) v
.findViewById(R.id.icon_channel_list_adapter);
if (title == null || content == null || icon == null) {
Log.e("ERROR on findViewById",
"Couldn't find Title, Content or Icon");
}
ViewHolder mvh = new MyViewHolder(title, content, icon);
//We make the views become clickable
//so, it is not necessary to use the android:clickable attribute in
//XML
v.setOnClickListener(new ChannelListAdapter.OnClickListener(mvh) {
public void onClick(View v, ViewHolder viewHolder) {
//we toggle the enabled state and also switch the the
//background
MyViewHolder mvh = (MyViewHolder) viewHolder;
Channel ch = (Channel) mvh.data;
ch.setSelected(!ch.getSelected()); //toggle
if (ch.getSelected()) {
v.setBackgroundResource(R.drawable.row_blue_selected);
} else {
v.setBackgroundResource(R.drawable.row_blue);
}
//TESTING
Log.d("onClick() Channel", "onClick() Channel: "
+ ch.getTitle() + " selected: " + ch.getSelected());
}
});
return mvh;
}
Code de getView(...):
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
//When view is not null, we can reuse it directly, there is no need
//to reinflate it.
//We only inflate a new View when the view supplied by ListView is
//null.
if (view == null) {
view = mInflater.inflate(mViewId, null);
//call own implementation
holder = createHolder(view);
//TEST
//we set the holder as tag
view.setTag(holder);
} else {
//get holder back...much faster than inflate
holder = (ViewHolder) view.getTag();
}
//we must update the object's reference
holder.data = getItem(position);
//<EDIT SOLUTION>
if(getItem(position).get_id() == channelList.get(position).get_id()){
if(getItem(position).getSelected())
{
view.setBackgroundResource(R.drawable.row_blue_selected);
}
else{
view.setBackgroundResource(R.drawable.row_blue);
}
}
//</EDIT SOLUTION>
//call the own implementation
bindHolder(holder);
return view;
}
Je serait vraiment apprécier une idée de comment résoudre ce problème! 🙂
Si plus d'information est nécessaire s'il vous plaît dites-moi.
Merci d'avance!
OriginalL'auteur Beasly | 2011-01-03
Vous devez vous connecter pour publier un commentaire.
Laissez-moi vous montrer le code que j'utilise pour tous les
ListView
et de bien maîtriser l'événement click pour changer l'arrière-plan et faire rien de plusofficeslistitemlayout.xml le fichier sera comme la suite d'ajouter drawable et de la conception selon vous placez le code suivant dans RelativeLayout
Espère que ça aidera 🙂
Oui , vous avez juste besoin d'effectuer cette vérification dans la méthode getView .. reste, les choses seront faites automatiquement
En utilisant cette méthode, nous pouvons tirer un listview avec beaucoup de douceur et peut contrôler plus de cas que de bien.. à l'Aide de ce j'ai même mis en place l'animation de supprimer des fonctionnalités de l'iPhone TableView .. rouge bouton "supprimer" et d'autres trucs
Ok je vais voir comment ça fonctionne 🙂 u Peut fournir un bon tutoriel pour l'animation des trucs? Je n'ai jamais utilisé avant...
Son résout mes aspects et j'ai partagé ma aspects de la résolution de sorte qu'il peut aider les autres dans leurs aspects. Réponse ici doit être considérée comme une façon possible de procéder sur, plutôt attendre de réponse unique à la question.... C'est ma perception 🙂
OriginalL'auteur Javanator