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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bekam ich endlich die Antwort.
Erweiterte ich die EditText meine eigenen Klasse UpgEditText, dass war in der Lage die Methode setOnTextChangedListener was bedeutet, dass zur Beseitigung der bestehenden TextWatcher und eine neue hinzufügen.
UpgEditText
Ich habe auch ein ViewHolder in der Regel:
CustomAdapter getView () - Methode:
Alles funktioniert jetzt. Jedesmal, wenn eine convertView ist recycelt, die ich nur ändern Sie die Zuhörer, und es funktioniert gut.