2017-06-14 15 views
-1

私のアプリでは、完全なリストとお気に入りの2つのリストがあります。お気に入りで、私はこのお気に入りから車両を削除するには、ユーザーのためのオプションを表示する場合:私は、アダプタをインスタンス化する方法Android ArrayAdapter:アダプタ内からアイテムを削除する方法

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; 
    } 
} 

enter image description here

は、私は、次のアダプタを実装し、このカスタムリストビューの項目を表示するには断片(私はフラグメント内のリストをロードしています):

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

例外:

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) 

私の問題:私が正しい方法で削除ボタンを使用しているかどうかはわかりません。ご覧のとおり、アダプタクラスのリスナーを追加します。私は適切なアイテムを得ることができますが、削除しようとすると致命的なエラーが発生します。私は間違ったアプローチを使っていると信じていますが、私はこの削除オプションをどうやってやれるのか分かりません。我々はそれがArrayAdapterに変更することはできません配列として送信した場合の任意の助け

+0

また、logcatエラーとremove()メソッドも投稿してください。 – DaveNOTDavid

+0

アプリケーション内でアダプタをインスタンス化するコードをいくつか表示すると便利です。この問題は、アダプタがインスタンス化される方法と関連している可能性があり、インスタンス化されたアダプタのライブコンテンツを変更しようとすると、実行時に例外が表示されます。 – Livio

+0

@Livio質問に追加したばかりです –

答えて

1

の代わりに送信するための

おかげで、Verhicle []は、ArrayListのように送信します。

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

あなたの答えをありがとう。それは私に同じエラーを与える:クラスjava.lang.UnsupportedOperationException –

+0

更新私の答えは、見てみましょう。 –

+0

それはそれでした。 ArrayListはオブジェクトの正しいタイプでした。ありがとう –

関連する問題