Olá pessoal!
Estou fazendo uma lista de itens com checkedtextview. Quando eu clica na linha eu tenho que tagear o checkedtextview para apenas checkar aquele correspondente ao id do item. Só que dá erro de:
ERROR/AndroidRuntime(11952): java.lang.ClassCastException: android.widget.LinearLayout
Na linha final Long item = (Long) check.getTag();
veja parte do código:
@Override
public void onListItemClick (ListView l, View v, int position, long id) {
db.open();
cursor = db.getCursor();
cursor.moveToPosition(position);
inf.setPosition(position);
inf.setNumeroPedido(numeroPedido);//começa com 1
inf.setNomeItem(cursor.getString(cursor.getColumnIndex(DBAdapterV4.COLUNA_DESCRICAO_ITEM)));
inf.setIdItem(cursor.getInt(cursor.getColumnIndex(DBAdapterV4.COLUNA_ID_ITEM)));
inf.setValor(cursor.getInt(cursor.getColumnIndex(DBAdapterV4.COLUNA_VALOR_ITEM)));
db.inserirPedido(inf.getNumeroPedido(), inf.getIdCliente(), inf.getIdItem(), inf.getValor());
check = (CheckedTextView) findViewById(android.R.id.text1);
//check.setTag(inf.getIdItem());
check.setTag(inf.getIdItem());
final Long item = (Long) check.getTag();
((CheckedTextView) v).setChecked(cursor.getInt(cursor.getColumnIndex(DBAdapterV4.COLUNA_ID_ITEM)) == item ? true:false);
Log.i(CATEGORIA, " Selecionado = " + item);
Log.i(CATEGORIA, " Posição na Lista = " + position + " Posição no banco = " + inf.getIdItem() + " CheckedTextView = " +check.getTag());
Toast.makeText(this, "Você selecionou: " + inf.getNomeItem(), Toast.LENGTH_SHORT).show();
db.close(); cursor.close();
}
Alguém pode me ajudar?
O problema deve estar na linha 25, no parametro View v retorna o layout da linha, que no seu caso é um LinearLayout.
Outra coisa, voce não deveria estar lendo o db novamente aí. Usa o mesmo objeto que foi passado para o ListView.
você pode acessar o CheckedTextView via o metodo getChildAt(index) com os devidos cast´s
Bom dia!
Valeu pelas dicas amigos, vou testar, depois se der certo coloco como resolvido o post.
Até
Caro amigo Gusukuma!
Toda vez que clico numa das linhas da listview é marcado o checkedtextview diferente. Por exemplo, seleciono a linha 1, marca o chtv da linha 7. Como usar o getChildAt(position) para marcar o correspondente a linha que estou clicando? Pode me ajudar?
O getChildAt(indx) eh na linha clicada, o indx eh o indice da view no linearLayout a partir de zero
posta o layout do listview
Beleza amigo, o layout é assim:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tvId"
android:layout_width="20sp"
android:layout_height="50dip"
/>
<TextView
android:id="@+id/tvDescricao"
android:layout_width="225sp"
android:layout_height="50dip"
>
</TextView>
<TextView
android:id="@+id/tvVlrUnit"
android:layout_width="20sp"
android:layout_height="50dip"
>
</TextView>
<CheckedTextView
android:id="@android:id/text1"
android:layout_width="35sp"
android:layout_height="50dip"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
/>
</LinearLayout>
Os itens eu pego do banco de dados a partir de SimpleCursorAdapter, veja:
cursor = db.getCursor();///select * from item
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);
E a outra parte do onItemClickListener é a primeira que coloquei acima. O que quero fazer é quando marcar o CheckedTextView insere no banco, desmarca deleta do banco.
A parte de inserir e deletar no DBAdapter está ok. Só estou peleando nesta parte do CHTV.
Mais alguma dica, sou grato amigo.
No onListItemClick voce acessa:
CheckedTextView ctv = ( CheckedTextView) ((LinearLayout) v). getChildAt(3);
O problema de marcar linha errada pode ser que voce vai precisar fazer um adapter customizado