In meiner App ein Element löschen Ich habe zwei Listen der Fahrzeuge: Die vollständige Liste und meine Favoriten. When In Favoriten ich die Möglichkeit für den Benutzer zeige das Fahrzeug aus diesen Favoriten zu löschen: Android ArrayAdapter: Wie aus dem Adapter
diesen benutzerdefinierte Listenansicht Artikel zeigen, dass ich den folgenden Adapter implementiert:
public class VehicleAdapter extends ArrayAdapter<Vehicle> {
private int listType=1;
public Vehicle[] vehicles;
public VehicleAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull Vehicle[] objects, int listType) {
super(context, resource, objects);
this.listType = listType;
this.vehicles = objects;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
View customView = layoutInflater.inflate(R.layout.vehicle_row, null);
Vehicle vehicle = getItem(position);
ImageView imgVehicle = (ImageView) customView.findViewById(R.id.imgVehicle);
TextView txtTitle = (TextView) customView.findViewById(R.id.txtTitle);
TextView txtDescription = (TextView) customView.findViewById(R.id.txtDescription);
txtTitle.setText(vehicle.name);
txtDescription.setText(vehicle.short_description);
Picasso.with(getContext()).load(vehicle.picture).into(imgVehicle);
// If it's the favorites list
if(listType == 2) {
Button btnDelete = (Button) customView.findViewById(R.id.btnDelete);
btnDelete.setVisibility(View.VISIBLE);
final int itemPosition = position;
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Vehicle item = VehicleAdapter.this.vehicles[itemPosition];
remove(item); // HERE: throws fatal error
notifyDataSetChanged();
}
});
}
return customView;
}
}
Wie ich den Adapter in der instanziiert Fragment (ich bin die Liste in einem Fragment geladen):
Vehicle[] items = new Vehicle[vehicles.size()];
items = vehicles.toArray(items);
ListAdapter vehicleAdapter = new VehicleAdapter(getActivity(), R.layout.vehicle_row, items, mListType);
final ListView listView = (ListView) getView().findViewById(R.id.listView);
listView.setAdapter(vehicleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Vehicle vehicle = (Vehicle) adapterView.getItemAtPosition(i);
((MainActivity)getActivity()).loadVehicleInformation(vehicle);
}
});
die Ausnahme:
Exception java.lang.UnsupportedOperationException:
java.util.AbstractList.remove (AbstractList.java:638)
java.util.AbstractList$SimpleListIterator.remove (AbstractList.java:75)
java.util.AbstractCollection.remove (AbstractCollection.java:229)
android.widget.ArrayAdapter.remove (ArrayAdapter.java:244)
xx.xx.xxxxxx.VehicleAdapter.remove (VehicleAdapter.java:78)
xx.xx.xxxx.VehicleAdapter$1.onClick (VehicleAdapter.java:62)
android.view.View.performClick (View.java:4756)
android.view.View$PerformClick.run (View.java:19749)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:135)
android.app.ActivityThread.main (ActivityThread.java:5221)
Mein Problem: Ich bin mir nicht sicher, ob ich den richtigen Ansatz mit der Schaltfläche zum Löschen verwenden. Wie Sie sehen können, füge ich ihm einen Listener in der Adapterklasse hinzu. Ich kann das richtige Element abrufen, aber wenn ich versuche, es zu entfernen, wird ein schwerwiegender Fehler ausgegeben. Ich glaube, dass ich die falsche Herangehensweise verwende, aber ich bin verloren, wie ich diese Löschoption machen könnte.
Vielen Dank für jede Hilfe
Bitte melden Sie auch Logcat Fehler und Ihre remove() Methode. – DaveNOTDavid
Es wäre nützlich, wenn Sie die wenigen Codezeilen zeigen, die den Adapter in Ihrer App instanziieren. Das Problem hängt möglicherweise mit der Art zusammen, in der der Adapter instanziiert wird und die Ausnahme zur Laufzeit angezeigt wird, wenn Sie versuchen, den Live-Inhalt des instanziierten Adapters zu ändern. – Livio
@Livio ich gerade in der Frage hinzugefügt –