2017-06-14 2 views
-1

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: enter image description hereAndroid 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

+0

Bitte melden Sie auch Logcat Fehler und Ihre remove() Methode. – DaveNOTDavid

+0

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

+0

@Livio ich gerade in der Frage hinzugefügt –

Antwort

1

Statt senden, Verhicle [] als Arraylist senden, wenn wir als Array senden Sie es nicht in ArrayAdapter geändert werden kann.

public class VehicleAdapter extends ArrayAdapter<Vehicle> { 

    private int listType=1; 

    public ArrayList<Vehicle> vehicles; 

    public VehicleAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull ArrayList<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); 

     final 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); 

      btnDelete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        remove(vehicle); 
        notifyDataSetChanged(); 
       } 
      }); 
     } 

     return customView; 
    } 
} 
+0

Danke für Ihre Antwort. Es gibt mir den gleichen Fehler: class java.lang.UnsupportedOperationException –

+0

Meine Antwort aktualisiert, Schaue. –

+0

Das war es. ArrayList war der richtige Typ für die Objekte. Vielen Dank –

Verwandte Themen