Problema para pegar posição de array que foi clicada no ListView.

720 views
Skip to first unread message

Guilherme Bernardi

unread,
Sep 3, 2012, 10:26:57 AM9/3/12
to androidb...@googlegroups.com
Pessoal, bom dia.

Sou novato na programação Android e estou tendo um problema para obter o item de um ArrayList através de um ListView. Já tentei durante um bom tempo resolver, acredito que está passando algo batido ou não estou fazendo da maneira correta.

Eu tenho uma função que lê um Xml, monta um ArrayList e retorna o mesmo, então eu declarei um ArrayList para receber este ArrayList:

public class ListaProduto extends ListActivity {
ArrayList<String> listaProdutos = new ArrayList<String>();

Quando eu chamo o ListView eu carrego este Array, meu problema está em obter o Item selecionado pois vou precisar manipulá-lo na Activity anterior.

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listaProdutos = XmlPullParsing();
setListAdapter(new ArrayAdapter<String>(this, R.layout.listaproduto, listaProdutos));
ListView listView = getListView();
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(new OnItemClickListener() {
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
 Intent troca = new Intent(ListaProduto.this, CadastroPedido.class);
 ArrayList<String> itemSelected = new  ArrayList<String>();
 itemSelected.add(listaProdutos.get(position));
 
 troca.putStringArrayListExtra("listaProduto", itemSelected);
 
 setResult(RESULT_OK, troca);
 ListaProduto.this.finish();
 
 }
}); 
//listView.setOnItemClickListener(onSelecionarItem);
}

E estou recebendo a exceção:
ClassCastException: java.util.ArrayList

Quando passo nesta linha:
itemSelected.add(listaProdutos.get(position)); 

Se alguém puder me ajudar?

Obrigado.

Maicon Strey

unread,
Sep 3, 2012, 10:43:07 AM9/3/12
to androidb...@googlegroups.com
Tenho quase certeza que esse assunto foi discutido mais de uma vez aqui na lista. da uma procurada no histórico do grupo.

Maicon Strey
Novo Hamburgo - RS - Brasil
------------------
Linux user: #525086
------------------



2012/9/3 Guilherme Bernardi <gui.ber...@gmail.com>

Guilherme Bernardi

unread,
Sep 3, 2012, 1:06:37 PM9/3/12
to androidb...@googlegroups.com
Sim, você tem razão eu dei uma boa olhada achei bastante coisa referente ao uso de ListView e acesso aos itens, mas continuo tendo problemas.

Mas não sei se é pelo jeito que estou montando o ListView, mas não estou conseguindo acessar a variável que carrego a lista. Se puder me ajudar eu agradeço.
Vou tentar explicar melhor:

Eu tenho uma função que lê um Xml no cartão de memória e eu monto a Lista que será carregada no ListView dessa forma:

  ArrayList<String> produto = new ArrayList<String>();
            produto.add(codigo);
            produto.add(nome);
            produto.add(prvenda);
            Collection l = Arrays.asList(produto);
            Lista.addAll(l);

Eu retorno essa lista e passo ela diretamente para o ListView:

setListAdapter(new ArrayAdapter<String>(this, R.layout.listaproduto, XmlPullParsing()));

Ai dentro do click do Item eu estou tentando obter o Array que eu passei na função XmlPullParsing().
 
   Intent troca = new Intent(ListaProduto.this, CadastroPedido.class);
 ArrayList<String> itemSelected = new  ArrayList<String>();
  itemSelected.add(listaProdutos.get(position));
 troca.putStringArrayListExtra("listaProduto", itemSelected);
 
 setResult(RESULT_OK, troca);
 ListaProduto.this.finish();

Eu acho que o problema está na declaração da variável listaProdutos, eu não tenho certeza. Pois quando eu faço o debug do código ele passa a primeira vez naquela linha em negrito adiciona o que eu quero corretamente ao itemSelected e se eu mando continuar, ele passa novamente ocorrendo a exceção. Eu precisaria passar o array para a outra Activity para manipular os dados, preciso passar um dado para cada campo.

Agora não sei, pode ser que esteja complicando atoa na montagem da ListView. Se puder me ajudar, eu agradeço.

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 1:14:58 PM9/3/12
to androidb...@googlegroups.com
Mãe do céu ...

Guilherme, eu acho que não é bem isso que está no seu código, será que é mesmo?
Tem uma maçaroca de variáveis aí, não exatamente claras quanto ao uso.
Se você puder, manda o código completo dessa activity. Tudo bem para você colocar o código aqui para vermos?

Abraço,
Pedro
--
-----------------------------------------------------
Pedro E. Cunha Brigatto
Twitter: @pedrobrigatto, GoogleTalk: pedrob...@gmail.com
-----------------------------------------------------

Guilherme Bernardi

unread,
Sep 3, 2012, 1:20:22 PM9/3/12
to androidb...@googlegroups.com
OnCreate:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this, R.layout.listaproduto, XmlPullParsing()));
ListView listView = getListView();
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(new OnItemClickListener() {
private ArrayList<String> listaProdutos;
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
 Intent troca = new Intent(ListaProduto.this, CadastroPedido.class);
 ArrayList<String> itemSelected = new  ArrayList<String>();
 itemSelected.add(listaProdutos.get(position));
 troca.putStringArrayListExtra("listaProduto", itemSelected);
 setResult(RESULT_OK, troca);
 ListaProduto.this.finish();
 
 }
}); 
}

Função que lê xml interno:

private ArrayList<String> XmlPullParsing(){
    //private void XmlPullParsing(){

    ArrayList<String> Lista = new ArrayList<String>();
        
try {
        InputStream is = openFileInput("produto.xml");
            XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
            parser.setInput(is, null);
            int eventType = parser.getEventType();
            
            String codigo="";
            String nome="";
            String prvenda="";
            String tag="";
            
            while(eventType != XmlPullParser.END_DOCUMENT) {
           
            if(eventType==XmlPullParser.START_TAG){
                    tag=parser.getName();
            if (tag.equals("Codigo"))
               {
                   eventType = parser.next();
                   codigo = parser.getText();
               }
               else if (tag.equals("Descricao"))
               {
                   eventType = parser.next();
                   nome = parser.getText();
               }
               else if (tag.equals("PrVenda"))
               {
                eventType = parser.next();
                prvenda = parser.getText();
               }
                }
           
            if(eventType==XmlPullParser.END_TAG){
           
            tag=parser.getName();
           
            if (tag.equals("PrVenda"))
            {
            ArrayList<String> produto = new ArrayList<String>();
            produto.add(codigo);
            produto.add(nome);
            produto.add(prvenda);
            Collection l = Arrays.asList(produto);
            Lista.addAll(l);
            }
            }
           
                eventType = parser.next();
            }

        } catch (XmlPullParserException e) {
        e.printStackTrace();  
            
        } catch (IOException e) {
            e.printStackTrace();  

        }
        
return Lista;
    }


Tem isso dai.

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 1:28:00 PM9/3/12
to androidb...@googlegroups.com
Essa linha funciona? >>  itemSelected.add(listaProdutos.get(position));
Colocando um breakpoint ali e executando esta linha, qual o resultado que você obtem?

Guilherme Bernardi

unread,
Sep 3, 2012, 1:31:07 PM9/3/12
to androidb...@googlegroups.com
Então, ele passa a primeira vez adiciona o indice todo do Array que está dentro do listaProdutos, mas ele não saí desta linha.
Ai se eu dou um novo f6, ele tenta passar novamente nesta linha e dá a exceção que coloquei no primeiro post neste tópico.

ClassCastException: java.util.ArrayList 

Guilherme Bernardi

unread,
Sep 3, 2012, 1:33:20 PM9/3/12
to androidb...@googlegroups.com
Eu acho que o problema pode estar relacionado a declaração do ArrayList listaProdutos.

Se eu coloco ele global, eu não consigo acessá-lo dentro do evento, só se eu mudá-lo para final.
E quando eu estou debugando ele não é detectável na primeira vez que passo pela linha, mesmo ele adicionando os dados ao itemSelected dentro do Evento.

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 1:38:38 PM9/3/12
to androidb...@googlegroups.com
Na verdade, eu perguntei porque o problema provavelmente esteja aí mesmo, viu Guilherme.
Você está trabalhando com duas listas e parece que não está muito OK o que você está fazendo não ...

Aliás, a própria criação de "produtos" deveria estar representada como instâncias de produto mesmo, eu criaria um bean para este tipo de entidade e o qualificaria como serializável para que possa ser passado dentro da intent, como você está fazendo. E trabalharia também com um custom adapter, mantendo essa lista de instâncias de produto internamente, no adapter mesmo. Fica muito mais simples, muito mais direto e bem mais tranquilo de manipular. 

Cria uma subclasse de BaseAdapter, implementa ela mantendo uma List de instâncias de Produto, e eu acho que você terá mais legibilidade e bem menos dificuldade de seguir adiante. Qualquer coisa dá um toque e a gente troca uma ideia sobre isso ... beleza?

[]s,
Pedro

Guilherme Bernardi

unread,
Sep 3, 2012, 1:44:48 PM9/3/12
to androidb...@googlegroups.com
Ok, vou dar uma estudada e tentar implementar dessa forma.

Obrigado.

Guilherme Bernardi

unread,
Sep 3, 2012, 2:08:02 PM9/3/12
to androidb...@googlegroups.com
Eu entendi, dei uma pesquisada e comecei a fazer aqui.

Nesse contexto então eu carregaria os produtos na Bean Serializável dessa forma:

  Produto objProduto = new Produto();
            objProduto.set_Codigo(Integer.parseInt(codigo));
            objProduto.set_Descricao(nome);
            objProduto.set_PrVenda(prvenda);
            list.add(objProduto);  

E ai ela seria carregada na list da subclasse de BaseAdapter?

Em segunda-feira, 3 de setembro de 2012 14h38min41s UTC-3, Pedro Brigatto escreveu:

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 2:29:27 PM9/3/12
to androidb...@googlegroups.com
Isso.

Encapsule em uma classe Produto tudo o que for relativo a produto, e use essa classe para representar produtos em seu app.
Dentro do adapter seu (sub-classe de BaseAdapter, como você colocou), mantenha a lista de produtos como global (atributo), e implemente os métodos auxiliares de carregamento e manipulação da lista sempre baseado nesta lista.

Para facilitar para você, crie um construtor deste adaptador já recebendo o contexto da atividade que será exibida, se você precisar carregar um layout customizado na tela também. E eu normalmente nem uso ListActivity também, gosto de usar Activity padrão e customizar tanto layout quanto comportamento mais livremente.

Enfim ... acho que é isso, Guilherme. Certeza que ficará bem mais fácil para você trabalhar desta forma.

[]s,
pedro

Guilherme Bernardi

unread,
Sep 3, 2012, 2:54:40 PM9/3/12
to androidb...@googlegroups.com
Desculpe, continuar enchendo a paciência. É que como nunca fiz isso, estou tendo algumas dúvidas, estou tentando procurar também antes de vir perguntar.

Por exemplo, eu tenho aquela minha função XmlPullParsing, ela lê o Xml e agora eu estou adicionando ao objeto Produto conforme mostrou no post anterior. E essa função retorna uma Lista. Eu não precisaria mais retornar essa lista? Eu apenas buscaria pela Bean? Como funcionaria dessa maneira?
Minha sub-classe BaseAdapter ficou assim:

public class ProdutoAdapter extends BaseAdapter{
   
    List<Produto> produtos;
    Context context; 
     
        public ProdutoAdapter(Context contexto, List<Produto> produto) {
        this.produtos = produto;
        this.context = contexto;
        }

public int getCount() {
return produtos.size(); 
}

public Object getItem(int index) {
return produtos.get(index);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
Produto produto = produtos.get(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       View v = inflater.inflate(R.layout.listaproduto, null);
       
TextView codigo = (TextView) v.findViewById(R.id.cod_pro);
TextView nome = (TextView) v.findViewById(R.id.nome_pro);
TextView valor = (TextView) v.findViewById(R.id.valor_pro);
codigo.setText(produto.get_Codigo());
nome.setText(produto.get_Descricao());
valor.setText(produto.get_PrVenda());
return v;
}
public Context getContext() { 
       return context; 
   } 

   public void setContext(Context context) { 
       this.context = context; 
   } 

   public List<Produto> getProdutos() { 
       return produtos; 
   } 

   public void setProdutos(List<Produto> produtos) { 
       this.produtos = produtos; 
   }
   
    }

Agora uma outra dúvida, tudo bem eu li o xml adicionei ao objeto Produto e carreguei na lista da sub-classe do BaseAdapter. Agora eu teria de acessar a sub-classe para poder carregá-la no ListView no OnCreate da Activity, correto?

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 3:24:50 PM9/3/12
to androidb...@googlegroups.com
Oi Guilherme.

A lista é para isso mesmo, é para ajudar e para ser ajudado.

Para facilitar, entenda o adapter como o Model de uma estrutura quasi-MVC que existe aqui na API Android e também é bem comum em outros frameworks non-mobile, como o Swing e outros. Enquanto a sua ListView encapsula comportamento de visão e controle, ficará sob a responsabilidade do seu adapter manter os dado que efetivamente são mostrados na lista.

O seu método xmlPullParsing() pode ser usado para valorar a lista de produtos do adaptador. Continua valendo. Você monta uma lista de produtos dentro desse método e usa essa lista para passá-la para o adaptador (pode ser já no construtor do adaptador). Quando você criar a instância do adaptador e defini-la como adaptador da sua list view, todo o resto é entre a lista e o adaptador, transparente pra você. Você recupera o item selecionado através da lista mesmo, e o item selecionado a partir do adapter (recuperando o item da lista de produtos a partir da posição selecionada na sua lista).

Fechou a ideia?

Abraço,
Pedro

Guilherme Bernardi

unread,
Sep 3, 2012, 3:34:52 PM9/3/12
to androidb...@googlegroups.com
Então ficaria da seguinte maneira, você viu lá da maneira que eu montei a sub-classe ProdutoAdapter.
Nela eu retorno a lista de produtos, que eu montei atráves do XML.

Então no create, eu faço a instância do adapter passando:
 
      ArrayList<Produto> produtos = (ArrayList<Produto>) XmlPullParsing();
setListAdapter(new ProdutoAdapter(this, produtos));

E pelo click da List eu vou instanciar o adapter passando a posição que eu cliquei e vou obter o Item da lista do adapter, seria isto?

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 3:40:44 PM9/3/12
to androidb...@googlegroups.com
Talvez seu método xmlPullPasing() já pudesse retornar List<Produto>, não?
Mas é basicamente isso que você colocou aí sim, Guilherme. Boa sorte aí no código, vai rolar. :)

[]s,
Pedro

Guilherme Bernardi

unread,
Sep 3, 2012, 3:57:07 PM9/3/12
to androidb...@googlegroups.com
Consegui fazer o que queria, deu certo.

Pedro, obrigado pela atenção e pela ajuda.

Pedro E. Cunha Brigatto

unread,
Sep 3, 2012, 5:52:22 PM9/3/12
to androidb...@googlegroups.com

Não há de que, sempre um prazer ajudar.

[]s,
Pedro

Reply all
Reply to author
Forward
0 new messages