I have an Adapter that extends ArrayAdapter. I give an ArrayList to the Adapter with, for example, 9 objects, and I want it to not show the fifth object in the ListView.
Is there a way to do this? I tried with setting convertView = null
before returning but it throws a NullPointerException
.
This is the relevant code, it makes the view to not take values, but it adds it to the listview anyway:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
/*@SuppressLint("ViewHolder") */public class AdapterActions extends ArrayAdapter<Action>{
// our ViewHolder.
// caches our TextView
static class ViewHolderItem {
TextView codigo;
TextView accion;
TextView evento;
Switch UnSwitch;
boolean isChecked1;
}
Activity context;
ArrayList<Action> listaActions;
@SuppressLint("UseSparseArrays") Map <Integer, Boolean> map = new HashMap<Integer, Boolean>();
// Le pasamos al constructor el contexto y la lista de contactos
public AdapterActions(Activity context, ArrayList<Action> listaActions) {
super(context, R.layout.layout_adapter_actions, listaActions);
this.context = context;
this.listaActions = listaActions;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolderItem viewHolder;
// Rescatamos cada item del listview y lo inflamos con nuestro layout
//View item = convertView;
//item = context.getLayoutInflater().inflate(R.layout.layout_adapter_actions, null);
// well set up the ViewHolder
viewHolder = new ViewHolderItem();
if(convertView==null){
// inflate the layout
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.layout_adapter_actions, parent, false);
// well set up the ViewHolder
viewHolder.codigo = (TextView) convertView.findViewById(R.id.codigo);
viewHolder.accion = (TextView) convertView.findViewById(R.id.accion);
viewHolder.evento = (TextView) convertView.findViewById(R.id.evento);
viewHolder.UnSwitch = (Switch) convertView.findViewById(R.id.activa);
convertView.setLongClickable(true);
// store the holder with the view.
convertView.setTag(viewHolder);
}else{
// we've just avoided calling findViewById() on resource everytime
// just use the viewHolder
viewHolder = (ViewHolderItem) convertView.getTag();
}
Action a = new Action(-99, 1, 1, true);
AccionDefinida LaAccion = new AccionDefinida(0, 0, "", "");
EventoDefinido ElEvento = new EventoDefinido(0, 0, "", "");
//ACTIONS
ActionsSQLite base = new ActionsSQLite(context, "Actions", null,1);
SQLiteDatabase db1 = base.getReadableDatabase();
db1 = context.openOrCreateDatabase("Actions",SQLiteDatabase.OPEN_READONLY, null);
String query = "SELECT * FROM Actions WHERE Id = " + String.valueOf(position + 1);
Cursor c1 = db1.rawQuery(query, null);
try{
if(c1!=null){
int i = c1.getColumnIndexOrThrow("Id");
int j = c1.getColumnIndexOrThrow("IdAccionDefinida");
int k = c1.getColumnIndexOrThrow("IdEventoDefinido");
int l = c1.getColumnIndexOrThrow("Activa");
boolean esActiva;
//Nos aseguramos de que existe al menos un registro
while(c1.moveToNext()){
if (c1.getInt(l) == 0){
esActiva = false;
} else
{
esActiva = true;
}
//Recorremos el cursor hasta que no haya más registros
a = new Action(c1.getInt(i), c1.getInt(j), c1.getInt(k), esActiva);
}
}
else
Toast.makeText(context.getApplicationContext(),
"No hay nada :(", Toast.LENGTH_LONG).show();
}
catch (Exception e){
Log.i("bdActions", "Error al abrir o crear la base de datos" + e);
}
if(db1!=null){
db1.close();
}
if(a.getId() != -99)
{
//EVENTOS
EventosDefinidosSQLite base2 = new EventosDefinidosSQLite(this.context, "EventosDefinidos", null, 1);
SQLiteDatabase db2 = base2.getReadableDatabase();
db2 = context.openOrCreateDatabase("EventosDefinidos",SQLiteDatabase.OPEN_READONLY, null);
String query2 = "SELECT * FROM EventosDefinidos WHERE Id = " + a.getIdEventoDefinido();
Cursor c2 = db2.rawQuery(query2, null);
try{
if(c2!=null){
int h = c2.getColumnIndexOrThrow("Id");
int k = c2.getColumnIndexOrThrow("IdEvento");
int i = c2.getColumnIndexOrThrow("Nombre");
int j = c2.getColumnIndexOrThrow("Aux");
//Nos aseguramos de que existe al menos un registro
while(c2.moveToNext()){
//Recorremos el cursor hasta que no haya más registros
ElEvento = new EventoDefinido(c2.getInt(h), c2.getInt(k), c2.getString(i), c2.getString(j));
}
}
else
Toast.makeText(context.getApplicationContext(),
"No hay nada :(", Toast.LENGTH_LONG).show();
}
catch (Exception e){
Log.i("bdEventos", "Error al abrir o crear la base de datos" + e);
}
if(db2!=null){
db2.close();
}
//ACCIONES
AccionesDefinidasSQLite base3 = new AccionesDefinidasSQLite(context, "AccionesDefinidas", null,1);
SQLiteDatabase db3 = base3.getReadableDatabase();
db3 = context.openOrCreateDatabase("AccionesDefinidas", SQLiteDatabase.OPEN_READONLY, null);
String query3 = "SELECT * FROM AccionesDefinidas WHERE Id = " + String.valueOf(a.getIdAccionDefinida());
Cursor c3 = db3.rawQuery(query3, null);
try{
if(c3!=null){
int h = c3.getColumnIndexOrThrow("Id");
int k = c3.getColumnIndexOrThrow("IdAccion");
int i = c3.getColumnIndexOrThrow("Nombre");
int j = c3.getColumnIndexOrThrow("Aux");
//Nos aseguramos de que existe al menos un registro
while(c3.moveToNext()){
//Recorremos el cursor hasta que no haya más registros
LaAccion = new AccionDefinida(c3.getInt(h), c3.getInt(k), c3.getString(i), c3.getString(j));
}
}
else
Toast.makeText(context.getApplicationContext(),
"No hay nada :(", Toast.LENGTH_LONG).show();
}
catch (Exception e){
Log.i("bdAcciones", "Error al abrir o crear la base de datos" + e);
}
if(db3!=null){
db3.close();
}
// object item based on the position
// assign values if the object is not null
if(a != null) {
// get the TextView from the ViewHolder and then set the text (item name) and tag (item ID) values
viewHolder.codigo.setText(String.valueOf(a.getId()));
viewHolder.codigo.setTag(a.getId());
viewHolder.accion.setText(LaAccion.getNombre());
viewHolder.evento.setText(ElEvento.getNombre());
viewHolder.UnSwitch.setChecked(a.getActiva());
Log.e("Position+1: "+ String.valueOf(position+1), "Id: "+ String.valueOf(a.getId()));
}
viewHolder.isChecked1 = viewHolder.UnSwitch.isChecked();
map.put(position, viewHolder.isChecked1);
viewHolder.UnSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("OnClick", "Se clickeó");
listaActions.get(position).setActiva(map.get(position));
Log.e("Listener del switch", "Modificó la action en la lista de la ActividadPrincipal");
int isActiva;
if(map.get(position) == true)
{
isActiva = 0;
Log.e("Listener del switch", "isActiva = 1");
map.put(position, false);
} else
{
isActiva = 1;
Log.e("Listener del switch", "isActiva = 0");
map.put(position, true);
}
String query = "UPDATE Actions SET Activa = " + String.valueOf(isActiva) + " WHERE Id = " + String.valueOf(position+1);
Log.e("Consulta:", query);
Log.e("Listener del switch", "query creado");
Log.e("La position debería ser", String.valueOf(position+1));
Log.e("Y el valor del map.get(position) es", String.valueOf(map.get(position)));
ActionsSQLite helper1 = new ActionsSQLite(context, "Actions", null, 1);
Log.e("Listener del switch", "Creo el helper");
SQLiteDatabase db = helper1.getWritableDatabase();
Log.e("Listener del switch", "obtenida la base escribible");
db.execSQL(query);
Log.e("Listener del switch", "Query ejecutado");
}
});
} else
{
convertView = null;
}
return convertView;
}
}
Once you've told ArrayAdapter that you have (for example) 9 items, then your getView function needs to be able to create views for all 9 items. If you don't actually want one of those items to show up in the adapter, then you need to remove it from the adapter, so that Android doesn't call getView to display that item.
There are a couple of ways you could solve this problem. The easiest is to construct your adapter like you are currently doing, then call remove(action) for the actions you don't want included.
Another option would be to override BaseAdapter instead of ArrayAdapter. Then you could have more complicated code to figure out dynamically how many items you want to show. BaseAdapter is more flexible, but still quite simple to implement.
Make sense?