Listview com separador

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.

Grato e aguardo qualquer orientação.

Cria um layout em outro arquivo e jogo esse layout nas linhas do listview

aqui tem um “how to” bem legal

[quote=fabriciov]Cria um layout em outro arquivo e jogo esse layout nas linhas do listview

aqui tem um “how to” bem legal
http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/[/quote]

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.

[quote=aprendiz_ce][quote=fabriciov]Cria um layout em outro arquivo e jogo esse layout nas linhas do listview

aqui tem um “how to” bem legal
http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/[/quote]

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.[/quote]

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! :slight_smile:

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);
public class ListAdapter extends BaseAdapter {

private Context  mContext;
private ArrayList<ArrayList<String>> mListaComida;

public ListAdapter(Context context, ArrayList<ArrayList<String>> listaComida){
super();
mContext = context;
mListComida =  new ArrayList<ArrayList<String>>(listaComida);
}



}

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
    View viewHolder = convertView;
    TextView textViewComida = (TextView) viewHolder.findViewById(R.id.textcomida);
      
    ArrayList<String> list =  mListaComida.get(position);
    
    String stringComida = "";      
    for(String string:list){
        stringComida += (string + "\n")
    }

    textViewComida.setText(stringComida);
 
return viewHolder;
 }

fiz esse código rapidão, mas acho que da para entender a ideia!

[quote=fabriciov][quote=aprendiz_ce][quote=fabriciov]Cria um layout em outro arquivo e jogo esse layout nas linhas do listview

aqui tem um “how to” bem legal
http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/[/quote]

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.[/quote]

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! :slight_smile:

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);
public class ListAdapter extends BaseAdapter {

private Context  mContext;
private ArrayList<ArrayList<String>> mListaComida;

public ListAdapter(Context context, ArrayList<ArrayList<String>> listaComida){
super();
mContext = context;
mListComida =  new ArrayList<ArrayList<String>>(listaComida);
}



}

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
    View viewHolder = convertView;
    TextView textViewComida = (TextView) viewHolder.findViewById(R.id.textcomida);
      
    ArrayList<String> list =  mListaComida.get(position);
    
    String stringComida = "";      
    for(String string:list){
        stringComida += (string + "\n")
    }

    textViewComida.setText(stringComida);
 
return viewHolder;
 }

fiz esse código rapidão, mas acho que da para entender a ideia![/quote]

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.

Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas

String stringComida = ""; String stringTitulo = ""; for(String string:list){ if(sstring.startsWith("::")){ stringTitulo = string.replace("::",""); }else{ stringComida += (string + "\n") } }

[quote=fabriciov]Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas

String stringComida = ""; String stringTitulo = ""; for(String string:list){ if(sstring.startsWith("::")){ stringTitulo = string.replace("::",""); }else{ stringComida += (string + "\n") } } [/quote]

Estou penando aqui… (rs)

Coloco esse código dentro do “getView”, é isso?

[quote=aprendiz_ce][quote=fabriciov]Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas

String stringComida = ""; String stringTitulo = ""; for(String string:list){ if(sstring.startsWith("::")){ stringTitulo = string.replace("::",""); }else{ stringComida += (string + "\n") } } [/quote]

Estou penando aqui… (rs)

Coloco esse código dentro do “getView”, é isso?[/quote]

isso mesmo!

esse metodo getview vai retornar uma view que sera colocada em uma linha da Listview

[code]@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewHolder = convertView;
TextView textViewComida = (TextView) viewHolder.findViewById(R.id.textcomida);
TextView textViewTitulo= (TextView) viewHolder.findViewById(R.id.textTitulo);

ArrayList<String> list =  mListaComida.get(position);  
  
String stringComida = "";        
String stringTitulo = "";
for(String string:list){  
    if(string.startsWith("::")){
     stringTitulo = string.replace("::","");
    }else{
    stringComida += (string + "\n")  
    }
}  

textViewTitulo.setText(stringTitulo);
textViewComida.setText(stringComida);  

return viewHolder;
} [/code]

[quote=fabriciov][quote=aprendiz_ce][quote=fabriciov]Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas

String stringComida = ""; String stringTitulo = ""; for(String string:list){ if(sstring.startsWith("::")){ stringTitulo = string.replace("::",""); }else{ stringComida += (string + "\n") } } [/quote]

Estou penando aqui… (rs)

Coloco esse código dentro do “getView”, é isso?[/quote]

isso mesmo!

esse metodo getview vai retornar uma view que sera colocada em uma linha da Listview

[code]@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewHolder = convertView;
TextView textViewComida = (TextView) viewHolder.findViewById(R.id.textcomida);
TextView textViewTitulo= (TextView) viewHolder.findViewById(R.id.textTitulo);

ArrayList<String> list =  mListaComida.get(position);  
  
String stringComida = "";        
String stringTitulo = "";
for(String string:list){  
    if(string.startsWith("::")){
     stringTitulo = string.replace("::","");
    }else{
    stringComida += (string + "\n")  
    }
}  

textViewTitulo.setText(stringTitulo);
textViewComida.setText(stringComida);  

return viewHolder;
} [/code][/quote]

Beleza.

Qualquer novidade volto aqui.

Grato pela sua atenção.

[quote=aprendiz_ce][quote=fabriciov][quote=aprendiz_ce][quote=fabriciov]Você pode adicionar na posição 0 o titulo e os demais os produtos, ou uma tag ::Bebidas

String stringComida = ""; String stringTitulo = ""; for(String string:list){ if(sstring.startsWith("::")){ stringTitulo = string.replace("::",""); }else{ stringComida += (string + "\n") } } [/quote]

Estou penando aqui… (rs)

Coloco esse código dentro do “getView”, é isso?[/quote]

isso mesmo!

esse metodo getview vai retornar uma view que sera colocada em uma linha da Listview

[code]@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewHolder = convertView;
TextView textViewComida = (TextView) viewHolder.findViewById(R.id.textcomida);
TextView textViewTitulo= (TextView) viewHolder.findViewById(R.id.textTitulo);

ArrayList<String> list =  mListaComida.get(position);  
  
String stringComida = "";        
String stringTitulo = "";
for(String string:list){  
    if(string.startsWith("::")){
     stringTitulo = string.replace("::","");
    }else{
    stringComida += (string + "\n")  
    }
}  

textViewTitulo.setText(stringTitulo);
textViewComida.setText(stringComida);  

return viewHolder;
} [/code][/quote]

Beleza.

Qualquer novidade volto aqui.

Grato pela sua atenção.[/quote]

fabriciov não consegui não.

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.

poste ai, se quiser pode mandar o projeto para o meu email e olho assim que sair do trabalho

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

getView:


@Override
public View getView(int position, View view, ViewGroup viewGroup) {
        
        ProdutosVO vo = (ProdutosVO) getItem(position);

        LayoutInflater layout = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = layout.inflate(br.com.droiddblistseparador.R.layout.layout_lista_produtos, null);
        
        TextView textViewCodigo = (TextView) v.findViewById(br.com.droiddblistseparador.R.id.textViewCodigo);
        textViewCodigo.setText(vo.getCodigo().toString());
        
        TextView textViewDescricao = (TextView) v.findViewById(br.com.droiddblistseparador.R.id.textViewDescricao);
        textViewDescricao.setText(vo.getDescricao());
        
        TextView textViewEan = (TextView) v.findViewById(br.com.droiddblistseparador.R.id.textViewEan);
        textViewEan.setText(vo.getEan());
        
        TextView textViewGrupo = (TextView) v.findViewById(br.com.droiddblistseparador.R.id.textViewGrupo);
        textViewGrupo.setText(vo.getGrupo());
        
        return v;

Activity que exibe:


public class ListaProdutosActivity extends ListActivity {

         @Override
          protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ProdutosDAO dao = new ProdutosDAO(getBaseContext());
                
              setListAdapter(new ProdutosAdapter(getBaseContext(), dao.getAll()));
        
    }
}

Fico no aguardo por suas orientações.

Muitíssimo obrigado pela sua pronta atenção.

Forte abraço!

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

[quote=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[/quote]

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.

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.

[quote=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.

[/quote]

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”.

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.

[code]ArrayList list = getall();
list.sort(); //implementa o compare

Arraylist list2 = new Arraylist();
ArraList<ArraList> list3 = new ArraList<ArraList>():

String string = list.get(0).getGrupo();
for( Object temp : 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
[/code]

Com ctz deve ter jeitos bem mais eficientes, so parar para pensar um pouco :slight_smile:
Nessa parte ja não involve mais android e sim sua própria logica de extração e leitura.

[quote=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.

[code]ArrayList list = getall();
list.sort(); //implementa o compare

Arraylist list2 = new Arraylist();
ArraList<ArraList> list3 = new ArraList<ArraList>():

String string = list.get(0).getGrupo();
for( Object temp : 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
[/code]

Com ctz deve ter jeitos bem mais eficientes, so parar para pensar um pouco :slight_smile:
Nessa parte ja não involve mais android e sim sua própria logica de extração e leitura.

[/quote]

Beleza.

Vou ver aqui como fica depois da sua ajuda.

Forte abraço!