UnsupportedOperationException when adding object in a list

2

I am using a Adapter that extends from RecyclerView.Adapter to show information obtained from a query SQL . When I perform the query at BD I get a List<Inventario> .
When entering a Inventario when List<Inventario> is of size zero, I get the Exception UnsupportedOperationException and when its size is greater than zero it works without problems.

InventoryFragment

public class InventarioFragment extends Fragment implements View.OnClickListener, 
TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {

  private RecyclerView.Adapter adapter;
  private List<Inventario> inventarios;
  ...

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_inventario, container, false);

    RecyclerView recycler = (RecyclerView) view.findViewById(R.id.rvInventarios);
    recycler.setHasFixedSize(true);

    RecyclerView.LayoutManager lManager = new LinearLayoutManager(getActivity());
    recycler.setLayoutManager(lManager);

    inventarios = new InventarioSQL(getContext()).getInventarios();
    adapter = new InventarioAdapter(getContext(), inventarios);
    recycler.setAdapter(adapter);

    ...

    return view;
  }

  @Override
  public void onClick(View v) {
      switch (v.getId()) {
          case R.id.fabAgregarInventario:
              mostrarFormulario();
              break;
          case R.id.btnCancelarInventario:
              dialog.dismiss();
              break;
          case R.id.btnCrearInventario:
              if (this.validarFormulario()) {
                  try {
                      Inventario inventario = crearInventario();
                      inventarios.add(0, inventario);  // Acá se produce el error cuando el size() es cero.
                      adapter.notifyDataSetChanged();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  dialog.dismiss();
              }
              break;
      }
  }

  ...
}

Exception

java.lang.UnsupportedOperationException
  at java.util.AbstractList.add(AbstractList.java:404)
  at java.util.AbstractList.add(AbstractList.java:425)
  at com.inventario.sti.InventarioFragment.onClick(InventarioFragment.java:134)
  at android.view.View.performClick(View.java:4438)
  at android.view.View$PerformClick.run(View.java:18422)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5001)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
  at dalvik.system.NativeStart.main(Native Method)

InventoryAdapter

  public class InventarioAdapter extends RecyclerView.Adapter<InventarioAdapter.InventarioViewHolder> {

      private List<Inventario> items;
      private Context context;

      public InventarioAdapter(Context context, List<Inventario> items) {
          this.items = items;
          this.context = context;
      }

      @Override
      public InventarioViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_inventario, parent, false);
          return new InventarioViewHolder(v);
      }

      @Override
      public void onBindViewHolder(InventarioViewHolder holder, int position) {
          String nombreInventario = new InventarioSQL(context).getInventario(items.get(position).getInventario_id()).getNombre();
          ...

          holder.inventario.setText(nombreInventario);
          ...

      }

      @Override
      public int getItemCount() {
          return items.size();
      }

      public static class InventarioViewHolder extends RecyclerView.ViewHolder {

          public TextView inventario;
          ...

          public InventarioViewHolder(View itemView) {
              super(itemView);
              inventario = (TextView) itemView.findViewById(R.id.inventario);
              ...
          }
      }

  }

SQL Inventory

  public class InventarioSQL {
      private InventarioDao inventarioDao;

      public InventarioSQL(Context context) {
          DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, "sti-db", null);
          SQLiteDatabase db = openHelper.getWritableDatabase();
          DaoMaster daoMaster = new DaoMaster(db);
          DaoSession daoSession = daoMaster.newSession();
          inventarioDao = daoSession.getInventarioDao();
      }

      public List<Inventario> getInventarios() {
          return inventarioDao.queryBuilder().orderDesc(InventarioDao.Properties.Creado_el).list();
      }

      public Inventario getInventario(Integer id) {
          return inventarioDao.queryBuilder().where(InventarioDao.Properties.Id.eq(id)).unique();
      }

      public void addInventario(Inventario inventario) {
          inventarioDao.insert(inventario);
      }

      public void updateInventario(Inventario inventario) {
          inventarioDao.update(inventario);
      }
  }

createInventory ()

  private Inventario crearInventario() {
      UserLocalStore userLocalStore = new UserLocalStore(getContext());
      InventarioSQL inventarioSQL = new InventarioSQL(getContext());
      String username = userLocalStore.getUsername();
      Usuario usuario = null;
      Inventario nuevoInventario;
      int tipoInventario;
      String observaciones;
      Date fecha = new Date();
      try {
          usuario = new UsuarioSQL(getContext()).getUsuario(username);
          tipoInventario = spinnerTipoInventario.getSelectedItemPosition();
          observaciones = txtObservaciones.getText().toString();

          nuevoInventario = new Inventario();
          nuevoInventario.setUsuario_id(usuario.getId_remota());
          nuevoInventario.setTipo_inventario_id(tipoInventario);
          nuevoInventario.setObservaciones(observaciones);
          nuevoInventario.setCreado_el(fecha);
          inventarioSQL.addInventario(nuevoInventario);

      } catch (Exception e) {
          e.printStackTrace();
          if (usuario == null) {
              Toast.makeText(getContext(), username + " no está registrado.", Toast.LENGTH_LONG).show();
          }
          return null;
      }

      return nuevoInventario;
  }
    
asked by Marcelo 18.02.2016 в 20:25
source

1 answer

0

In InventoryFragment is changed:

private List<Inventario> inventarios;
inventarios = new InventarioSQL(getContext()).getInventarios();

for

private ArrayList<Inventario> inventarios;
inventarios = new InventarioSQL(getContext()).getInventariosArrayList();

In InventoryAdapter is changed:

import java.util.List;
private List<Inventario> items;
public InventarioAdapter(Context context, List<Inventario> items)

for

import java.util.ArrayList;
private ArrayList<Inventario> items;
public InventarioAdapter(Context context, ArrayList<Inventario> items)

In SQL Inventory add:

public ArrayList<Inventario> getInventariosArrayList() {
    return new ArrayList<Inventario>(inventarioDao.queryBuilder().orderDesc(InventarioDao.Properties.Creado_el).list());
}
    
answered by 19.02.2016 / 00:23
source