0

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;


    }
}
  • You need to post your code. – Jared Burrows Jan 11 '15 at 04:59
  • There's no need to post the code in this case, I don't need to get an answer based in my code, I need to get an answer based on what I want to do. It's a way to do it, not a code to do it. Anyways, I'll post it if you want. – Nahue Federico Jan 11 '15 at 05:04

1 Answers1

0

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?

Bruce
  • 2,377
  • 1
  • 17
  • 11
  • But that's what I'm doing and it doesn't work: If you see in the onClick of the delete button, I do a remove() of the deleted Action in the arraylist... – Nahue Federico Jan 12 '15 at 02:45
  • I don't see a remove call in the code you posted, but if you are removing from the ArrayList, and not the adapter, that's not good enough. You need to call ArrayAdapter.remove, and then call notifyDatasetChanged. – Bruce Jan 12 '15 at 04:28
  • I call a remove outside that code, in a Dialog. So you're saying that I should do an ActionsAdapter.remove(index) when I'm doing too an listaActions.remove(index)? – Nahue Federico Jan 12 '15 at 14:53
  • ArrayAdapter manages the list of items, so your listaActions becomes a duplicate of that, which is asking for bugs. I would say either extend BaseAdapter and keep your listaActions field, or else get rid of listaActions and access the items by calling ArrayAdapter functions. – Bruce Jan 12 '15 at 16:36
  • And how can I access the items if I don't have the listaActions field? which are the functions that you're talking about? – Nahue Federico Jan 14 '15 at 21:32
  • The functions I mean are getItem, add, and remove. Here is the doc for ArrayAdapter: http://developer.android.com/reference/android/widget/ArrayAdapter.html – Bruce Jan 14 '15 at 21:38
  • You're right, I should use ArrayAdapter without database. Thank you! – Nahue Federico Jan 15 '15 at 02:22