Pregunta

Tengo lista de casillas de verificación en la lista binded por simpleCursorAdapter personalizado. En mi simpleCursorAdapter costumbre, hemos anulado newView y bindView con mis modificaciones. He conseguido de alguna manera de hacer multichoice. Lo extraño es, después de eliminar cualquier elemento de mi lista, casilla de verificación del primer punto se está comprobando, de repente. ¿Cómo se hace eso? ¿Cómo puedo solucionarlo?

Mi clase SimpleCursorAdapter:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

Aquí está la parte de código de la clase ListActivity que describe el botón que elimina los elementos de cuadro controladas:

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
¿Fue útil?

Solución

No creo que SimpleCursorAdapter es la clase de derecho de extender aquí.

¿Está el Estado "marcada" conectado con el XML de datos de alguna manera? ¿No? Por lo que necesita su propio adaptador personalizado!

Básicamente todos los adaptadores tienen que poner en práctica una forma de generar una vista de un elemento dado (más precisamente una posición elemento!). Esto se llama en cualquier momento cuando la lista quiere mostrar un elemento. Ahora, el truco que utiliza es reutilizar anteriormente creado la lista elementos de la vista de que no puede ser visto en la pantalla más! Por lo tanto:. Cuando se desplaza la lista de abajo y un elemento desaparece en la parte superior, exactamente esta subventana se volverá a utilizar para el siguiente elemento que aparece

elementos

Así que, cuando este método se llama con una vista determinada "viejo" que debe ser reutilizado, todos contenidos tendrán que ser establecido según los elementos de datos. Si una casilla de verificación es parte de este juego, que tendrá que tener un almacenamiento para el estado de activación! No es suficiente tener una casilla de verificación, ya que habrá menos objetos de casilla de verificación, ya que hay elementos de la lista!

SimpleCursorAdapters están ahí para - sí - representan las cosas simples. Un XML que describe datos (imágenes y texto, como los estados de documentación). Debido a esta simplicidad todo lo que tiene que hacer aquí es proporcionar un método para crear nuevos Ver elemento de objetos - que no está interceptando el proceso de re-uso en todo! Básicamente, sólo sabe cómo poner los datos en un objeto vista existente - pero le falta el conocimiento de cómo manejar las cajas controladas / sin marcar

Su solución: escribir su propia extensión BaseAdapter y hacer lo que hay que hacer: poner en práctica "getView" (y algunos otros métodos como getItem, GetItemID y getCount). No es difícil en absoluto! Este Demostración API utiliza un BaseAdapter y el estado mExpanded aquí es básicamente idéntica a sus estados casilla!

Buena suerte!

Otros consejos

Es posible que tenga que llamar notifyDataSetChanged cuando modifica los datos.

El problema es probablemente que usted está llamando desde dentro de la setChecked onItemClickListener. Una forma de evitar esto es hacky que hacer lo siguiente antes y después de llamar setChecked desde el interior de su oyente:

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

Esto evitará que su onItemClickListener de conseguir invoca cuando llama manualmente setChecked.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top