Android: Custom-Adapter mit ViewHolder, OnCheckedChangedListener und TextChangedListener

Ich bin neu in der Android-und Java-Programmierung, und ich habe auf ein problem stoßen, vor kurzem. Ich habe auf der Suche eine Antwort für Stunden, aber ich war nicht erfolgreich.
Ich habe eine custom ListView-und ein custom-adapter, mit dem Sie eine Zeile mit einer CheckBox und ein EditText. Wann immer es angezeigt wird, zum ersten mal, es ist OK, aber wenn ich nach unten scrollen, beginnt es, ändern die Werte der CheckBox und dem EditText.

Hier ist meine row_edit.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <EditText
        android:id="@+id/bonus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:inputType="numberSigned"
        android:gravity="right"
        android:selectAllOnFocus="true"
        android:textSize="16sp" />

    <CheckBox
        android:id="@+id/checkBox_person"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/bonus"
        android:textSize="16sp" />

</RelativeLayout>

Item_edit (Objekt-adapter):

public class Item_edit {
    private String meno;
    private boolean ucast;
    private int bonus;

    public Item_edit(String meno, boolean ucast, int bonus) {
        super();
        this.meno = meno;
        this.ucast = ucast;
        this.bonus = bonus;
    }

    public String getMeno() {
        return meno;
    }

    public boolean getUcast() {
        return ucast;
    }

    public int getBonus() {
        return bonus;
    }

    public void setMeno(String meno) {
        this.meno = meno;
    }

    public void setUcast(boolean ucast) {
        this.ucast = ucast;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
}

ListView war nicht glatt, wenn ich scrollen, und das ist, warum ich beschlossen, einen ViewHolder.
Adapter_edit:

public class Adapter_edit extends ArrayAdapter<Item_edit> {
    private final Context context;
    private final ArrayList<Item_edit> itemsArrayList;
    private final Edit edit;

    public Adapter_edit(Context context, ArrayList<Item_edit> itemsArrayList, Edit edit) {

        super(context, R.layout.row_edit, itemsArrayList);
        this.edit = edit;
        this.context = context;
        this.itemsArrayList = itemsArrayList;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_edit, parent, false);
            holder = new ViewHolder();
            //Log.e("NewHolder", "position = " + position);
            holder.checkBox = (CheckBox) convertView
                    .findViewById(R.id.checkBox_person);
            holder.bonus = (EditText) convertView.findViewById(R.id.bonus);
            convertView.setTag(holder);

            holder.checkBox.setText(itemsArrayList.get(position).getMeno());
            holder.checkBox.setChecked(itemsArrayList.get(position).getUcast());
            holder.bonus.setText(Integer.toString(itemsArrayList.get(position)
                    .getBonus()));

            holder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                            itemsArrayList.get(position).setUcast(isChecked);
                        }
                    });

            holder.bonus.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    try {

                        if (itemsArrayList.get(position).getBonus() != Integer
                                .parseInt(s.toString()) && !edit
                                .getUcast(position)) {
                            itemsArrayList.get(position).setBonus(
                                    Integer.parseInt(s.toString()));
                            itemsArrayList.get(position).setUcast(true);
                        }
                    }
                    catch (NumberFormatException e) {
                        itemsArrayList.get(position).setBonus(0);
                    }

                }

                @Override
                public void afterTextChanged(Editable s) {
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
            });

        }

        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.checkBox.setText(itemsArrayList.get(position).getMeno());
        holder.checkBox.setChecked(itemsArrayList.get(position).getUcast());
        holder.bonus.setText(Integer.toString(itemsArrayList.get(position)
                .getBonus()));

        return convertView;
    }

    static class ViewHolder {
        CheckBox checkBox;
        EditText bonus;
    }
}

Nach Debuggen mit der LogCat ich weiß, dass es nur 8 Inhaber generiert (denn es gibt (0-7) Elemente, die passen zu meinem Bildschirm). Diese wiederverwendet werden, wenn ich nach unten scrollen. Es gibt keine OnCheckedChangeListeners und TextChangedListeners erstellt für die Elemente mit position größer als 7.

Ich habe keine Ahnung, was zu tun ist. Kann mir jemand helfen?

InformationsquelleAutor sweco | 2014-02-24
Schreibe einen Kommentar