Hallo,
ich verwende ein ListFragment zusammen mit einem ArrayAdapter.
In der Liste habe ich mehrere Einträge. Für jeden Eintrag sollen Buttons angezeigt werden - z.B. einer Löschen, der andere Bearbeiten. Es gibt Einträge in der Liste, die EditOnly sind (der Eintrag darf bearbeitet, aber nicht gelöscht werden). Für die soll der Löschen-Button nicht angezeigt werden. Funktioniert auch, nur manchmal vergißt der Button seine Einstellungen. Ich verstehe nur nicht wieso. Also manchmal werden Buttons, die für einen normalen Eintrag da sind auf InVisible gesetzt und der gesetzte OnClickListener ist auch nicht mehr vorhanden, als ob es ein EditOnly Eintrag wäre und manchmal werden bei dem einen EditOnly Eintrag die Buttons angezeigt. Ich habe momentan 6 Einträge. Der erste ist der "echte" EditOnly. Aber manchmal vergißt der ArrayAdapter/ListView das. Und manchmal sind dann der 5. oder 6. Eintrag auch EditOnly (also so wie die Buttons angezeigt werden - in der Datenbank bzw. values-Liste sind sie es nicht). Die Anzeige für die Einträge ist länger als das Display. Ich kann/muß also scrollen und dann wird das getView auch erneut aufgerufen. Ich setze momentan den Eintrag im OnCreate/OnUpgrade für die Datenbank auf EditOnly. Es ist also hardgecoded, welcher Eintrag EditOnly ist.
Kann mir das jemand erklären wieso das so ist? Eigentlich dachte ich, ich habe für einen speziellen Eintrag auch einen neuen Button erstellt und das Objekt für den Eintrag auch extra im ViewHolder gespeichert, damit da keine Verwechslung geschehen kann. Und eigentlich dachte ich, ich bekomme von der ListView genau die RowView/das Objekt übergeben, das ich mal angelegt habe. Aber irgendwie bringt die ListView ja anscheinend doch die Buttons durcheinander.
MFG
speedy
ich verwende ein ListFragment zusammen mit einem ArrayAdapter.
In der Liste habe ich mehrere Einträge. Für jeden Eintrag sollen Buttons angezeigt werden - z.B. einer Löschen, der andere Bearbeiten. Es gibt Einträge in der Liste, die EditOnly sind (der Eintrag darf bearbeitet, aber nicht gelöscht werden). Für die soll der Löschen-Button nicht angezeigt werden. Funktioniert auch, nur manchmal vergißt der Button seine Einstellungen. Ich verstehe nur nicht wieso. Also manchmal werden Buttons, die für einen normalen Eintrag da sind auf InVisible gesetzt und der gesetzte OnClickListener ist auch nicht mehr vorhanden, als ob es ein EditOnly Eintrag wäre und manchmal werden bei dem einen EditOnly Eintrag die Buttons angezeigt. Ich habe momentan 6 Einträge. Der erste ist der "echte" EditOnly. Aber manchmal vergißt der ArrayAdapter/ListView das. Und manchmal sind dann der 5. oder 6. Eintrag auch EditOnly (also so wie die Buttons angezeigt werden - in der Datenbank bzw. values-Liste sind sie es nicht). Die Anzeige für die Einträge ist länger als das Display. Ich kann/muß also scrollen und dann wird das getView auch erneut aufgerufen. Ich setze momentan den Eintrag im OnCreate/OnUpgrade für die Datenbank auf EditOnly. Es ist also hardgecoded, welcher Eintrag EditOnly ist.
Code:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View rowView = convertView;
if(rowView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.categorylist_rowlayout, parent, false);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.name = (TextView) rowView.findViewById(R.id.Name);
viewHolder.buttonDelete = (Button) rowView.findViewById(R.id.ButtonDelete);
viewHolder.buttonEdit = (Button) rowView.findViewById(R.id.ButtonEdit);
//Hier zeigt er mir die richtigen Werte. Es ist die richtige Position, mit dem richtigen Eintrag und nur der EditOnly sein soll ist EditOnly
Log.i("getView","Neu: Position: "+ position +", Name: " + values.get(position).getName() + ", EditOnly: "+ values.get(position).isEditOnly());
if(values.get(position).isEditOnly())
{
viewHolder.buttonDelete.setVisibility(View.INVISIBLE);
}
else
{
viewHolder.buttonDelete.setVisibility(View.VISIBLE);
viewHolder.buttonDelete.setOnClickListener(this);
}
viewHolder.buttonEdit.setOnClickListener(this);
rowView.setTag(viewHolder);
}
//Hier zeigt er mir die richtigen Werte. Es ist die richtige Position, mit dem richtigen Eintrag und nur der EditOnly sein soll ist EditOnly
Log.i("getView","Position: "+ position +", Name: " + values.get(position).getName() + ", EditOnly: "+ values.get(position).isEditOnly());
ViewHolder viewHolder = (ViewHolder) rowView.getTag();
//Wenn ich hier nicht noch einmal die Werte setzen würde, dann kann es vorkommen, daß unten
//in der Log-Ausgabe ein Button auf Visible ist, den ich beim neu Anlegen auf Invisible
//gesetzt habe oder umgekehrt. Der OnClickListener ist auch nicht mehr gesetzt.
if(values.get(position).isEditOnly())
{
viewHolder.buttonDelete.setVisibility(View.INVISIBLE);
}
else
{
viewHolder.buttonDelete.setVisibility(View.VISIBLE);
viewHolder.buttonDelete.setOnClickListener(this);
}
Log.i("getView","Invisible: "+(viewHolder.buttonDelete.getVisibility()==View.INVISIBLE));
viewHolder.name.setText(values.get(position).getName());
return rowView;
}
Kann mir das jemand erklären wieso das so ist? Eigentlich dachte ich, ich habe für einen speziellen Eintrag auch einen neuen Button erstellt und das Objekt für den Eintrag auch extra im ViewHolder gespeichert, damit da keine Verwechslung geschehen kann. Und eigentlich dachte ich, ich bekomme von der ListView genau die RowView/das Objekt übergeben, das ich mal angelegt habe. Aber irgendwie bringt die ListView ja anscheinend doch die Buttons durcheinander.
MFG
speedy