Checkbox e SimpleCursorAdapter e ListView

Boa tarde!

Amigos, estou com dificuldade de implementar um listener para o checkbox de uma lista. Tem uma lista de itens que é colocada numa listview. Cada linha tem “_id do item” “descrição do item” “valor do item” “checkbox”. Quando o checkbox estiver marcado, insere no banco, desmarcado deleta do banco em tempo real. Os métodos para inserir e deletar estão prontos e funcionando. O problema é que eu nao consigo fazer o listener do checkbox, já vi vários exemplos mas não funciona. Vejam meu código:


public class CardapioV4 extends ListActivity {
	Button btEnviar, btSair, btInserir;
    TextView tvNomeCliente, tvVlrTotal;
    CheckBox chBox1;
    DBAdapterV4 db;
    Cursor cursor;
    int selecionado;
    protected static final String CATEGORIA = "CARDÁPIO";
    
    private final List<String> selecionados = new ArrayList<String>();
    int valor, idCliente, numeroPedido = 1;
    String idItem, nomeCliente = "";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        
        
        db = new DBAdapterV4(getApplicationContext());
        db.open();
        cursor = db.getCursor();///select * from item
        idCliente = 0;
        Intent it = getIntent();
        Bundle parametro = it.getExtras();
        idCliente = parametro.getInt("id");        
        
        String[] from = {DBAdapterV4.COLUNA_ID_ITEM, DBAdapterV4.COLUNA_DESCRICAO_ITEM, DBAdapterV4.COLUNA_VALOR_ITEM};
    	int[] to = new int[]{R.id.tvId,R.id.tvDescricao,R.id.tvVlrUnit};
    	
    	
    	SimpleCursorAdapter rec = new SimpleCursorAdapter(this,R.layout.colunaslista, cursor, from, to);
    	
    	setListAdapter(rec);   	        
    	Log.i(CATEGORIA, "" + nomeCliente);
        cursor = db.consultarCliente(idCliente);
        nomeCliente = cursor.getString(cursor.getColumnIndex(DBAdapterV4.COLUNA_NOME_CLIENTE));
        tvNomeCliente.setText(nomeCliente);
        cursor.close();
	    db.close();
	            
    }
    
    @Override
    public void onListItemClick (ListView l, View v, int position, long id) {
		
		
		
		chBox1 = (CheckBox) findViewById(R.id.checkBox1);
		
		
		
		
		Toast.makeText(this, "Você selecionou: " + item, Toast.LENGTH_SHORT).show();
		
        chBox1.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				
				
			
				if(((CheckBox) v).isChecked()) {
					
					 Toast.makeText(CardapioV4.this, "Selected", Toast.LENGTH_SHORT).show();
					
				}else{
					
					Toast.makeText(CardapioV4.this, "Not selected", Toast.LENGTH_SHORT).show();
				}
				
				
				
			}
		
		});    			
		
    }
    
 
    
        
}

Alguém pode me ajudar?

Pelo o que eu entendi, o checkbox está dentro do seu adapter correto?

Então seu Listener deve ser implementado no ADAPTER que você criou! :slight_smile:

Entendeu?

Beleza amigo!!

Entendi o que vc disse, fazer assim:

SimpleCursorAdapter rec = new SimpleCursorAdapter(this,R.layout.colunaslista, cursor, from, to) { 

public void onListItemClick (ListView l, View v, int position, long id) {  
          
          
          
        chBox1 = (CheckBox) findViewById(R.id.checkBox1);  
          
          
          
          
        Toast.makeText(this, "Você selecionou: " + item, Toast.LENGTH_SHORT).show();  
          
        chBox1.setOnClickListener(new View.OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                  
                  
                  
              
                if(((CheckBox) v).isChecked()) {  
                      
                     Toast.makeText(CardapioV4.this, "Selected", Toast.LENGTH_SHORT).show();  
                      
                }else{  
                      
                    Toast.makeText(CardapioV4.this, "Not selected", Toast.LENGTH_SHORT).show();  
                }  
                  
                  
                  
            }  
          
        });               
          
    }  
      
  
      
          
}  

Eu tentei fazer assim, me baseando neste exemplo: http://cafeinati.wordpress.com/2011/09/05/android-resolvendo-problema-com-listview-e-checkbox/
A diferença é que ele usa CheckBox. Porém no método dele pega a view usando o getView e retorna um layout inflater.
Mas no meu exemplo o layout já está sendo passado para o simplecursoradapter.
Ai fiquei emperrado neste método.

ta vendo onde tem findViewById() no método onListItemClick ?

Coloca um v. na frente e passa a constante do checkbox que você passou como parametro no arquivo de layout que vc instanciou no método do SimpleCursorAdapter.

//Troca isso...
chBox1 = (CheckBox) findViewById(R.id.checkBox1);

//Por isso!
chBox1 = (CheckBox) v.findViewById(R.id.checkBox1);

Você tem que dar um jeito de pegar a VIEW do arquivo de layout e tratar o evento de click no CheckBox daquela posição do ListView!

Porque você não cria um ADAPTER próprio cara? Muito mais fácil além do que você quem criou e você saberá como manipula-lo para ficar do jeitinho que você quer.

Hoje de noite vou estar postando no meu blog um artigo sobre como criar um adapter! Dá uma lida mais tarde, la pelas 22horas.

=)

Vlw Felipe, vou tentar fazer isto.
É que não estava entendendo como fazer um adapter com itens dinâmicos. Como o software é um cardápio de restaurante, os itens são mudados a todos instante. Mas vou olhar no seu blog.

Vlw por responder.

Um abraço.

Ei,

Fiz o artigo! Dá uma olhada la, abraço.
Espero ajudar!

=)