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