Как сделать адаптер, чтобы он не возвращал convertView?

У меня есть адаптер, который расширяет ArrayAdapter. Я даю ArrayList адаптеру, например, с 9 объектами, и я хочу, чтобы он не отображал пятый объект в ListView.

Есть ли способ сделать это? Я пробовал с настройкой convertView = null до возвращения, но он бросает NullPointerException,

Это соответствующий код, он заставляет представление не принимать значения, но все равно добавляет его в представление списка:

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;


    }
}

1 ответ

Решение

Как только вы сказали ArrayAdapter, что у вас есть (например) 9 элементов, ваша функция getView должна иметь возможность создавать представления для всех 9 элементов. Если вы на самом деле не хотите, чтобы один из этих элементов отображался в адаптере, вам нужно удалить его из адаптера, чтобы Android не вызывал getView для отображения этого элемента.

Есть несколько способов решить эту проблему. Проще всего создать свой адаптер так, как вы это делаете в настоящее время, а затем вызвать remove (action) для действий, которые вы не хотите включать.

Другой вариант - переопределить BaseAdapter вместо ArrayAdapter. Тогда вы могли бы иметь более сложный код для динамического определения количества элементов, которые вы хотите показать. BaseAdapter более гибок, но все же довольно прост в реализации.

Есть смысл?

Другие вопросы по тегам