Gostaria de saber como é que se faz uma Listview com separador. Tenho uma tabela de produtos (SQLite) e quero lista-los separando pelo grupo a qual cada produto pertence. Quero faz algo semelhante a lista de contatos que tem nos smartphones.
Exemplos de como necessito:
Cereais
Arroz
Feijão
Farinha
Bebidas
Refrigerante
Agua Mineral
Será que alguem poderia me ajuda? Dicas, tutorias e exemplos me ajudariam muito.
Realmente o exemplo é bem legal mesmo, mas o mesmo não mostra como seria com dados do DB.
O meu problema é exatamente e questão de criar o separador baseado em uma condição junto ao DB, ou seja, agrupar os dados por grupos e exibir separado no listview.
fabriciov
aprendiz_ce:
fabriciov:
Cria um layout em outro arquivo e jogo esse layout nas linhas do listview
Realmente o exemplo é bem legal mesmo, mas o mesmo não mostra como seria com dados do DB.
O meu problema é exatamente e questão de criar o separador baseado em uma condição junto ao DB, ou seja, agrupar os dados por grupos e exibir separado no listview.
Você pode fazer a extração dos dados, joga-los numa lista (hashmap, lista simples ou list de list) e implementar a extração na classe que herda BaseAdapter
Sabendo como extrair os dados do DB e separa-los, é so jogar eles na lista e fazer sua magica!
ArrayList<ArrayList<String>> ListaComida = new ArrayList<ArrayList<String>>();
ListaComida.add(getListaDeCereais():ArrayList<String>);
ListaComida.add(getListaDeBebidas():ArrayList<String>);
ListAdapter adapter = new ListAdapter(getContext(), ListaComida);
ListView.setAdapter(adapter);
Realmente o exemplo é bem legal mesmo, mas o mesmo não mostra como seria com dados do DB.
O meu problema é exatamente e questão de criar o separador baseado em uma condição junto ao DB, ou seja, agrupar os dados por grupos e exibir separado no listview.
Você pode fazer a extração dos dados, joga-los numa lista (hashmap, lista simples ou list de list) e implementar a extração na classe que herda BaseAdapter
Sabendo como extrair os dados do DB e separa-los, é so jogar eles na lista e fazer sua magica!
ArrayList<ArrayList<String>> ListaComida = new ArrayList<ArrayList<String>>();
ListaComida.add(getListaDeCereais():ArrayList<String>);
ListaComida.add(getListaDeBebidas():ArrayList<String>);
ListAdapter adapter = new ListAdapter(getContext(), ListaComida);
ListView.setAdapter(adapter);
fiz esse código rapidão, mas acho que da para entender a ideia!
Entendi perfeitamente o que o amigo passou, pois já uso Listview sem problemas. A grande questão é criar o “separador”, ou seja, o “titulo” (Holder) do grupo de cada produto, pois não estava conseguindo fazer nada.
Vou tentar seguir o seu exemplo e caso eu não consiga, espero puder contar com a sua valiosa ajuda.
Grato.
fabriciov
Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas
Será que se eu postar as três partes principais de um exemplo simulando o que necessito o colega poderia dar uma ajustada para mim?
Grato mais uma vez pela sua atenção e aguardo retorno.
fabriciov
poste ai, se quiser pode mandar o projeto para o meu email e olho assim que sair do trabalho
aprendiz_ce
Nossa, não quero tomar seu tempo não.
Segue abaixo as partes principais de um pequeno exemplo da minha realidade.
ProdutosDAO:
public List<ProdutosVO> getAll() {
SQLiteDatabase db = new DB(context).getWritableDatabase();
Cursor result = db.rawQuery("SELECT * FROM produtos", null);
List<ProdutosVO> lista = new ArrayList<ProdutosVO>();
while (result.moveToNext()) {
ProdutosVO vo = new ProdutosVO(result.getInt(0), result.getString(1), result.getString(2), result.getString(3));
lista.add(vo);
}
return lista;
}
Olha, aparentemente esta tudo certo! ja tentou usando a propria View passado no getView ?
//LayoutInflater layout = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//View v = layout.inflate(br.com.droiddblistseparador.R.layout.layout_lista_produtos, null);
View v = View;
Descreva o problema em si…
Não se preocupa, no meio da semana nunca tenho nada para fazer quando chego do trabalho!
Pelo tédio ja cheguei até fazer um programinha para gerar um dicionario de palavras para rodar um bruteforce numa rede que achei aqui perto kkkkkkkkkk
aprendiz_ce
fabriciov:
Olha, aparentemente esta tudo certo! ja tentou usando a propria View passado no getView ?
//LayoutInflater layout = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//View v = layout.inflate(br.com.droiddblistseparador.R.layout.layout_lista_produtos, null);
View v = View;
Descreva o problema em si…
Não se preocupa, no meio da semana nunca tenho nada para fazer quando chego do trabalho!
Pelo tédio ja cheguei até fazer um programinha para gerar um dicionario de palavras para rodar um bruteforce numa rede que achei aqui perto kkkkkkkkkk
Tá certo!
O meu problema é montar literalmente a listview com “titulo” e os seus respectivos “itens” conforme rasculhei no inicio do topo.
Como o codigo que te passei, aonde exatamente faço a montagem?
Nos meus testes (não foram poucos) fica tudo “meia-boca”, ou seja, as vezes consigo que apareça so os titulos, as vezes só os itens e até teve vezes de ficar tudo embaralhado, fora de ordem.
fabriciov
Bem, então o problema é na hora de preencher e ler a lista.
Na hora da query existe algo que você consegue diferenciar o que é “tipo” (Cereal, Bebida, etc) e o que é produto(Arroz, agua, etc) ?
Cada ProdutosVO é um “tipo” de comida, contendo seus componentes ? pq na hora de completar o getView você tem que fazer como se estivesse fazendo para um unico tipo de Produto.
aprendiz_ce
fabriciov:
Bem, então o problema é na hora de preencher e ler a lista.
Na hora da query existe algo que você consegue diferenciar o que é “tipo” (Cereal, Bebida, etc) e o que é produto(Arroz, agua, etc) ?
Cada ProdutosVO é um “tipo” de comida, contendo seus componentes ? pq na hora de completar o getView você tem que fazer como se estivesse fazendo para um unico tipo de Produto.
No exemplo apresentado aqui, os produtos tem o grupo a qual cada uma pertence. Cada registro que vem do DB possue a coluna “pro_codigo”,“pro_descricao”,“pro_grupo”. Quero separar pelo “pro_grupo”.
fabriciov
antes de enviar para o adapter grava todos em uma lista e ordena.
Não pensando muito, a primeira solução que veio em mente:
1 - Colocar em ordem alfabética
2 - verificar item por item, verificando se o item atual é igual o anterior, caso contrário guarda até o anterior numa lista, armazena essa lista em outra e parte para o próximo.
ArrayList<Object>list=getall();list.sort();//implementa o compareArraylist<Object>list2=newArraylist<Object>();ArraList<ArraList<Object>>list3=newArraList<ArraList<Object>>():Stringstring=list.get(0).getGrupo();for(Objecttemp:list){if(temp.getGrupo().equals(string)){list2.add(temp);}else{list3.add(list2);list2.clear();}string=temp.getGrupo();}//posição 1 da list3 vai ter so produtos do mesmo grupo//passa a posição 1 da list3 para o getView e preenche os textView
Com ctz deve ter jeitos bem mais eficientes, so parar para pensar um pouco :)
Nessa parte ja não involve mais android e sim sua própria logica de extração e leitura.
aprendiz_ce
fabriciov:
antes de enviar para o adapter grava todos em uma lista e ordena.
Não pensando muito, a primeira solução que veio em mente:
1 - Colocar em ordem alfabética
2 - verificar item por item, verificando se o item atual é igual o anterior, caso contrário guarda até o anterior numa lista, armazena essa lista em outra e parte para o próximo.
ArrayList<Object>list=getall();list.sort();//implementa o compareArraylist<Object>list2=newArraylist<Object>();ArraList<ArraList<Object>>list3=newArraList<ArraList<Object>>():Stringstring=list.get(0).getGrupo();for(Objecttemp:list){if(temp.getGrupo().equals(string)){list2.add(temp);}else{list3.add(list2);list2.clear();}string=temp.getGrupo();}//posição 1 da list3 vai ter so produtos do mesmo grupo//passa a posição 1 da list3 para o getView e preenche os textView
Com ctz deve ter jeitos bem mais eficientes, so parar para pensar um pouco :)
Nessa parte ja não involve mais android e sim sua própria logica de extração e leitura.