Ändern ListView hintergrund - seltsames Verhalten

Ich habe ein problem mit dem ändern der hintergrund von einer Ansicht in eine ListView.

, Was ich brauche:

Ändern Sie den hintergrund einer Zeile onClick()

, Was tatsächlich passiert:

Der hintergrund wird geändert (Auswahl) nach dem drücken z.B. der erste Eintrag. Aber nach unten scrollen, der 8. Eintrag ausgewählt wird, zu.
Blättern Sie zurück zum Anfang der ersten nicht mehr aktiviert. Der zweite Eintrag ist jetzt ausgewählt.
Weiter zu scrollen und es geht weiter springen...

, Was ich bin dong in den Code:

Ich habe Kanäle und onClick() ich toggle ein Attribut der Kanal boolean ausgewählt
und dann habe ich den hintergrund ändern.
Ich bin dabei nur onClick() das ist, warum ich verstehe nicht, warum es actuelly passiert auf der anderen Einträge auch.
Eine Sache, die ich bemerkt ist: Es scheint nur die "Zeichnung"-Teil, weil das Element, das ausgewählt "durch es selbst" hat immer noch die ausgewählt Wert auf false

Ich denke, es scheint sich was zu tun mit der Wiederverwendung der Blick in die benutzerdefinierte ListAdapters getView(...)

Code des onClick() in 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 von 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;
}

Ich würde wirklich zu schätzen jede Idee, wie dieses Problem zu lösen! 🙂

Wenn mehr Informationen benötigt werden bitte sagen Sie es mir.

Vielen Dank im Voraus!

InformationsquelleAutor Beasly | 2011-01-03
Schreibe einen Kommentar