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