Pergunta

Eu tenho lista de caixas de seleção na lista binded by personaliza simpleCursorAdapter. No meu costume simpleCursorAdapter, Eu substituí newView e bindView com minhas modificações. Consegui de alguma forma fazer multichoice. O mais estranho é que, depois de excluir qualquer item da minha lista, a caixa de seleção do primeiro item está sendo verificada de repente. Como isso acontece? Como posso resolver isso?

Meu SimpleCursorAdapter classe:

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

Aqui está a parte do código do ListActivity classe que descreve o botão que exclui os itens da caixa verificada:

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);
        }
    }
};
Foi útil?

Solução

Duvido que o SimpleCursoradapter seja a classe certa para se estender aqui.

O estado "verificado" está conectado ao Data XML de alguma forma? Não? Então você precisa do seu próprio adaptador personalizado!

Basicamente, todos os adaptadores precisam implementar uma maneira de gerar uma visualização de um determinado elemento (mais precisamente uma posição de elemento!). Isso será chamado a qualquer momento em que a lista deseja exibir um elemento. Agora, o truque que ele usa é reutilizar elementos de exibição de lista anteriormente criados que não podem ser vistos na tela! Assim: quando você rola sua lista e um elemento desaparece na parte superior, exatamente esse objeto de exibição será reutilizado para o próximo item que aparece.

Portanto, quando esse método é chamado com uma determinada visão "antiga" que deve ser reutilizada, todos os elementos contidos deverão ser definidos de acordo com os dados do Elements. Se uma caixa de seleção fizer parte deste jogo, você terá que ter um armazenamento para o estado verificado! Não é suficiente ter uma caixa de seleção, pois haverá menos objetos de caixa de seleção, pois existem elementos de lista!

SimpleCursoradapters estão lá - sim - representa coisas simples. Um XML descrevendo dados (imagens e texto, como afirma a documentação). Por causa dessa simplicidade, tudo o que você precisa fazer aqui é fornecer um método para criar novos objetos de exibição de elementos - você não está interceptando o processo de reutilização! Basicamente, ele sabe apenas como colocar os dados em um objeto de visualização existente - mas falta o conhecimento de como lidar com caixas verificadas/desmarcadas!

Sua solução: escreva sua própria extensão BaseAdapter e faça o que deve ser feito: implemente "getView" (e alguns outros métodos como GetItem, GetItemid e GetCount). Não é nada difícil! este Demonstração da API usa um BaseAdapter e o mExpanded O estado aqui é basicamente idêntico aos seus estados de caixa de seleção!

Boa sorte!

Outras dicas

Você pode precisar ligar notifyDataSetchanged Quando você modifica os dados.

O problema é provavelmente que você está chamando o SetChecked de dentro do OnItemClickListener. Uma maneira de fazer isso é fazer o seguinte antes e depois de ligar para o SetChecked de dentro do seu ouvinte:

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

Isso impedirá que seu OnItemClickListener seja chamado quando você ligar manualmente no SetChecked.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top