Android Criando um ListView Personalizado (Create a custom listview)

Custom ListView

Para criar um listView personalizado não é difícil porem é um trabalho chato de se fazer.
O conceito é, preencher uma lista de objetos que contem os dados de seu item e passar essa lista para um adapter que irá preencher o ListView, através desse adapter nós poderemos ter o controle sobre a lista, podendo remover item adicionar e pegar o selecionado.

Primeiro crie o layout de onde ficara seu listView, para isso criei o “main.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFFFF"
>
        <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#ECECEC"
        android:dividerHeight="1sp"
        />
</LinearLayout>

Após a criação do layout de apresentação criaremos o Item, vou criar um item bem simples, com uma texto e uma imagem. “item_list.xml”:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="5sp">
        <ImageView
            android:id="@+id/imagemview"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            />

        <TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="5sp"
            android:gravity="center_vertical"
            android:textColor="#FF000000"
        />
    </LinearLayout>
</LinearLayout>

Pronto a parte do XML está feita! agora vamos implementar no código.

Primeiramente criaremos nosso Objeto de acordo com nosso item.

public class ItemListView {

    private String texto;
    private int iconeRid;

    public ItemListView() {
    }

    public ItemListView(String texto, int iconeRid) {
        this.texto = texto;
        this.iconeRid = iconeRid;
    }

    public int getIconeRid() {
        return iconeRid;
    }

    public void setIconeRid(int iconeRid) {
        this.iconeRid = iconeRid;
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }
}

Após criado o Objeto vamos criar o Adapter, o coração do ListView.

O getView() é nosso método principal, ele é o atualizador da lista, que é frequentemente atualizada e a cada vez, esse método é executado de acordo com a quantidade de itens do getCont(). Ele recebe 3 parametros: a posição, a view da atualização anterior que é nosso layout já carregado (desatualizado) e o ViewGroup que é (se houver) o “pai” da view.

Vamos criar uma classe interna chamada ItemSuporte que vai ter as views de nosso layout. Essa classe é criada para nos proporcionar uma rápida atualização para não que não seja preciso carregar todos os dados novamente. Se nossa view não existir, vamos inflá-la (carregar) através do atributo LayoutInflater que foi criado no construtor da classe. Após o layout ser carregado e atribuído à view, vamos criar o ItemSuporte inserindo as views do item_list em seu interior. Depois de inserido, definimo-lo como uma tag da view pelo método setTag(), pois se a view já existisse nós apenas carregaríamos o ItemSuporte pelo getTag().

Após carregar ou criar a view, adicionamos o ItemListView respectivo à posição da lista e atualizamos os dados da nossa view pelos dados do nosso item e no final do método retornamos a view com os dados atualizados.

Vejá como é simples:

public class AdapterListView extends BaseAdapter {

    private LayoutInflater mInflater;
    private ArrayList<ItemListView> itens;

    public AdapterListView(Context context, ArrayList<ItemListView> itens) {
        //Itens que preencheram o listview
        this.itens = itens;
        //responsavel por pegar o Layout do item.
        mInflater = LayoutInflater.from(context);
    }

    /**
     * Retorna a quantidade de itens
     *
     * @return
     */
    public int getCount() {
        return itens.size();
    }

    /**
     * Retorna o item de acordo com a posicao dele na tela.
     *
     * @param position
     * @return
     */
    public ItemListView getItem(int position) {
        return itens.get(position);
    }

    /**
     * Sem implementação
     *
     * @param position
     * @return
     */
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View view, ViewGroup parent) {
        ItemSuporte itemHolder;
        //se a view estiver nula (nunca criada), inflamos o layout nela.
        if (view == null) {
            //infla o layout para podermos pegar as views
            view = mInflater.inflate(R.layout.item_list, null);

            //cria um item de suporte para não precisarmos sempre
            //inflar as mesmas informacoes
            itemHolder = new ItemSuporte();
            itemHolder.txtTitle = ((TextView) view.findViewById(R.id.text));
            itemHolder.imgIcon = ((ImageView) view.findViewById(R.id.imagemview));

            //define os itens na view;
            view.setTag(itemHolder);
        } else {
            //se a view já existe pega os itens.
            itemHolder = (ItemSuporte) view.getTag();
        }

        //pega os dados da lista
        //e define os valores nos itens.
        ItemListView item = itens.get(position);
        itemHolder.txtTitle.setText(item.getTexto());
        itemHolder.imgIcon.setImageResource(item.getIconeRid());

        //retorna a view com as informações
        return view;
    }

    /**
     * Classe de suporte para os itens do layout.
     */
    private class ItemSuporte {

        ImageView imgIcon;
        TextView txtTitle;
    }

}

Toda estrutura está feita, agora vamos colocar para funcionar.
Segue o código de implementação na nossa Activity principal:

public class MainActivity extends Activity implements OnItemClickListener {

    private ListView listView;
    private AdapterListView adapterListView;
    private ArrayList<ItemListView> itens;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //carrega o layout onde contem o ListView
        setContentView(R.layout.main);

        //Pega a referencia do ListView
        listView = (ListView) findViewById(R.id.list);
        //Define o Listener quando alguem clicar no item.
        listView.setOnItemClickListener(this);

        createListView();
    }

    private void createListView() {
        //Criamos nossa lista que preenchera o ListView
        itens = new ArrayList<ItemListView>();
        ItemListView item1 = new ItemListView("Guilherme Biff", R.drawable.biff);
        ItemListView item2 = new ItemListView("Lucas Volgarini", R.drawable.volgarini);
        ItemListView item3 = new ItemListView("Eduardo Ricoldi", R.drawable.ricoldi);
        ItemListView item4 = new ItemListView("Felipe Panngo", R.drawable.panngo);

        itens.add(item1);
        itens.add(item2);
        itens.add(item3);
        itens.add(item4);

        //Cria o adapter
        adapterListView = new AdapterListView(this, itens);

        //Define o Adapter
        listView.setAdapter(adapterListView);
        //Cor quando a lista é selecionada para ralagem.
        listView.setCacheColorHint(Color.TRANSPARENT);
    }

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        //Pega o item que foi selecionado.
        ItemListView item = adapterListView.getItem(arg2);
        //Demostração
        Toast.makeText(this, "Você Clicou em: " + item.getTexto(), Toast.LENGTH_LONG).show();
    }
}

Observação: As imagens foram inseridas na pasta res/drawable/ para quem não saiba, após inserida as imagens lá podemos pegar sua referencia pelo ResId.

Para quem quiser o projeto:

http://dl.dropbox.com/u/15643399/CustomListView.zip

(Lembre-se de nos ajudar clicando nos anúncios em nossa página.)

Help DEV – Analista desenvolvedor Java / Android
https://helpdev.com.br/zarelli

Android Criando um ListView Personalizado (Create a custom listview)

83 pensou em “Android Criando um ListView Personalizado (Create a custom listview)

  1. Muito bom o post!! Tenho duas perguntas:
    1. Qual IDE você utilizou para fazer este projeto???
    2. Depois de criada a aplicação, já em tempo de execução, como posso adicionar itens à lista? O dados podem ser inseridos através de um EditText e um Button por exemplo! Mas como adicioná-los ao ListView?
    3. Tem algum problema ter outros itens juntamente com o ListView? Por exemplo:

    Agradeço muito se puder responder…

    1. Obrigado Webert…
      Bom vamos lá…
      .
      1. Qual IDE você utilizou para fazer este projeto???
      R: Eu utilizei o NetBeans, estou mais familiarizado e gosto da interface.
      .
      2. Depois de criada a aplicação, já em tempo de execução, como posso adicionar itens à lista? O dados podem ser inseridos através de um EditText e um Button por exemplo! Mas como adicioná-los ao ListView?
      R: Sim você pode criar um edText e um bt e adicionar normalmente.
      O EditText e o Botao é so criar em seu XML que contem a ListView, essa parte acho que vc deve saber como fazer.
      Na parte de adicionar item é simples tambem, seguindo meu exemplo na classe MainActivity você tem um ArrayList de “itens” e o AdapterListView como variaveis, basta adicionar mais um item no arrayList e der um update no adapterListView ex:
      =============(MainActivity)
      public void addItem(String texto, int idImagem){
      ItemListView item = new ItemListView(texto, idImagem);
      itens.add(item1);
      adapterListView.notifyDataSetChanged();
      }
      =============
      Isso é permitido porque o arrayList que você passa pro adapterView é por referencia, então o que você mudar nele sera alterado no adapter.
      .
      (opcional) Para ter mais segurança o que normalmente faço e não deixar o arrayList como variavel de classe na MainActivity, criando um método que adiciona e remove itens dentro do proprio adapter, já que lá você tem o array e o método notifyDataSetChanged. Iria ficar do mesmo jeito porem melhor orientado e no local correto ex:
      ===================(AdapterListView)
      public void addItem(String texto, int idImagem){
      ItemListView item = new ItemListView(texto, idImagem);
      itens.add(item);
      notifyDataSetChanged();
      }
      ===================
      .
      3. Tem algum problema ter outros itens juntamente com o ListView? Por exemplo:
      Sem problemas nenhum.

  2. Olá Guilherme, parabéns pelo post, muito bom.

    Gerei uma versão similar aqui e funcionou blz.

    Queria tirar uma duvida, vc sabe se tem como eu mudar a cor da linha que separa os itens da lista?

    1. Obrigado Derzu.
      Bom para mudar a cor é bem simples, no seu arquivo de layout xml, vá no componente ListView e altere/insira o valor:

      android:divider=”#ECECEC”

      esse #ECECEC é a cor em hexa, para altera-la basta mudar o codigo. Existem varios sites que te geram o hexa da cor de acordo com a cor que você queira. De uma olhada nesse site: http://www.efeitosespeciais.net/tabela.htm nele você encontra varias cores com seus respectivos valores hexa, basta pegar e alterar no codigo.

  3. Muito bom o post.Só uma pergunta e se eu quiser inserir mais imagens e texto na linha como faço?
    já declarei aqui mais sempre quando vou chamar lá no
    private void createListView() {
    ….
    }
    da um erro,Porque será?

    1. STella para você inserir mais itens de acordo com o exemplo é só você adicionar mais um objeto ItemListView dentro do array “ArrayList itens” (tudo isso dentro do método createListView)….
      Não sei te dizer qual o erro que está dando, me mande o erro para analisar que te respondo.
      Obrigado.

  4. ola , Post muito bom
    estou como uma duvida,
    como eu posso deixa um item selecionado na lista.
    exemplo do um click no item da lista e aquele item fica colorido “selecionado”.
    obrigado
    agradeço desde Ja

    1. Não é possível fazer isso nativamente eu acredito, mas dá para fazer de varias outras formas, por exemplo, seu item é um XML ele tem seu LinearLayout root, defina um ID para ele, e adicione no objeto dos itens algo que diz que está selecionado ou não, ai quando você clica no item, vai ser chamado o evento “onitemclickselected”(se nao me engano) neste evento você define no objeto que está selecinado e atualiza o adapter, quando fazer isso no no método “getView” do Adapter Customizado você pega o LinearLayout e da um “setBackgroundColor” por exemplo.
      Pronto, você vai ter no objeto se está ou não selecionado e visivelmente tambem.

  5. ola, muito bom seu codigo, mas tenho uma duvida quanto ao fazer uma listview dinamica, onde pode ser inserida varios itens ao list e faze-la se atualizar. vc teria algo sobre isso?

    1. Para inserir mais itens e atualizar é simples, basta adicionar mais um item no seu array de itens e chamar o metodo de atualização como no exemplo abaixo:

      ItemListView item = new ItemListView(texto, idImagem);
      itens.add(item1);
      adapterListView.notifyDataSetChanged();

      Este exemplo é respectivo ao exemplo do post.

  6. Parabens Guilherme, muito bom o post. estava procurando por isso…
    Mas eu tenho uma duvida, tenho uma aplicação com um menu de opções, como faço para que uma delas chame esse ListView?

    1. Tudo bem Diego?
      cara vou te explicar bem por cima talvez você entenda ou não… qualquer coisa te explico mais detalhado.
      O conceito é o seguinte seu menu é composto por varias Views(LinearLayout,Buttons,TextView, etc) na sua classe de menu você deve implementar onClickListener e definir na view do item do seu menu o setOnClickListener(this); para escutar a ação de seleção. no método implementado do onclickListener basta você comparar se a view que você apertou é a mesma view do parametro do método, feito isso, é só você criar uma intent (Intent it = new Intent(this,ListaCustomizavel.class);) e chamar o startActivity passando sua intent (startActivity(it);).
      Pronto assim você vai chamar o ListView atravez de um menu.

  7. Parabéns Guilherme, belo post
    Tenho uma dúvida quanto mudar a cor do item selecionado ( deixar eu até sei) o problema é se eu voltar da outra activity, ele continua com a cor no fundo do item que selecionei para ir para activityB
    Como poderia para fazer para clicar e mudar a cor do fundo somente para mostrar q esta sendo clicado naquele item, tipo um click splash ( por um determinado tempo e depois volta ao normal)

    1. éssa é um pouquinho mais complicada… eu cheguei a fazer isso mas não foi com ListView… eu criei a lista manual com LinearLayout para cada item… ai o que eu fiz:
      1- implementei o OnTouchListener na minha classe.
      2- dei um .setOnTouchListener nos meus itens (seria no linearlayout do item/item root)
      3- ai voce iria implementar o onTouch, nele você vai tratar o seu “click splash” do jeito que você quer segue um exemplo:

          public boolean onTouch(View arg0, MotionEvent arg1) {
              if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
                  arg0.setBackgroundColor(Color.argb(50, 10, 130, 150));
              } else if (arg1.getAction() == MotionEvent.ACTION_UP || arg1.getAction() == MotionEvent.ACTION_CANCEL) {
                  view.setBackgroundColor(Color.TRANSPARENT);
              }
              return true;
          }
      

      acho que deu pra dar uma entendida deve ter outras formas… caso você não consiga da um tok ;)… mas acredito que dessa forma funcione o que você quer pois você tem as action_up e action_cancel, isso não vai deixar que a cor fique “setada”;

      1. Valeu Guilherme… obrigado pela ajuda
        Funcionou certinho o q vc passou.
        Agora tenho outra duvida, sou meio novo na programação android
        Como eu posso testar a conexão com o meu servidor, tenho um configurador onde digita o ip e porta, ai queria testar se ela está certa, como poderia fazer isso.
        Vc tem algum exemplo ai, se tiver poderia me explicar como usar
        Obrigado novamente.

        1. Bom você poderia fazer uma operalção comum… por exemplo se seu servidor for um socket tenta abrir a conexão se der excessão quer dizer que não é, se for um Servelet tenta tambem tente realizar alguma operação no servidor(mesmo procedimento)… da para voce fazer um teste de “ping” porem depende muito do servidor pois a maioria a porta é bloqueada mas você pode usar “InetAddress.getByName(“http://wordpress.com”).isReachable(1000);”

          teste por socket:

          try {
              Socket socket = new Socket("servidro.com.br", 8081);
              socket.getInputStream();
          } catch (Exception e) {
              e.printStackTrace();
          }
          

          HTTP:

                  try {
                      URL url = new URL("http://servidor.com.br:8081/");
          
                      HttpURLConnection http = (HttpURLConnection) url.openConnection();
                      http.setRequestMethod("POST");
                      http.addRequestProperty("content-type", "application/binary");
                      http.setDoInput(true);
                      http.setDoOutput(true);
          
                      http.connect();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
          

          Se der excessão em algum dos casos você vai saber que não é o endereço correto 😉 ai você pode implementar coisas mais complexas como realizar alguma operação mesmo se estiver certo para garantir que não so o endereco esteja certo mas tambem o serviço.

  8. Valeu pelo tutorial, me ajudou legal aki…
    Eu tive um problema atualmente com este codigo, eu fiz algo em cima doq vc postou. No caso seria uma tela bem parecida com essa, mas sem imagem.
    Fora do listview, tem um botao que ao ser clicado enviaria dados para o socket. Esse sistema do socket separadamente, esta funcionando normal, mas qndo coloco ele nesse clique do botão nao funciona… Meu sistema do android ja esta bem grande, talvez o meu erro seja com threads, no caso de eu usar mais de uma thread da algum problema ou saberia dizer oq pode esta acontecendo??

    1. Assim meio por cima é dificíl de saber, mas provavelmente pode ser pelas threads mesmo.. é um pouco complexo você utilizar threads no android pois você trabalha com threads de interface grafica e threads comuns… ou sejá se você esta em uma thread comun você não consegue interagir com sua tela.
      Da uma estudada em AsyncTask esse recurso vai te proporcionar você realizar um processo paralelo(thread) e com interação na interface grafica…
      http://zarelli.wordpress.com/2012/02/10/asynctask-executando-tarefas-em-segundo-plano/

      1. É isso mesmo que vc disse, eu testei no meu celular q é inferior ao android 3, ele funcionou normal, mas no meu tablet q é 3. alguma coisa não funcionou. E pelo q olhei por ai é isso mesmo… Mas estou muito perdido como usar essa classe, me dá uma luz se possivel…

      2. Opa, ja consegui aqui, conseguir entender o tutorial que vc me passou, era realmente isso… Me parece que o android a partir do 3 adiante não aceita o uso de multiplas thread sem o uso do AsynTask… Pois no meu celular funcionou e no tablet nao funciou como disse anteriormente. Ao utilizar esse AsynTask, funcionou blz…
        Vlw mesmo, ajudou muito, sucesso pra ti…

  9. Parabéns pelo post, muito bom mesmo!!!
    mas, infelizmente, estou com problemas na criação do projeto Android.
    Estou utilizando o NetBeans, e sou novo em java.
    para desenhar a aplicação utilizo o DroidDraw, que cria o Xml automaticamente.
    O problema é que o Netbeans da erro na linha do xml:
    “xmlns:android=”http://schemas.android.com/apk/res/android”>”
    ele não acha qualquer layout.
    O que faço agora???
    Por favor, me ajude se você puder…
    Agradeço desde já!!!

    1. Bom provavelmente deve estar com problema no plugin… se não for muito trabalho tente reinstalar o netbeans e refazer esses passos:

      http://zarelli.wordpress.com/2011/03/04/configurar-o-netbeans-para-o-android/

      Ou retire o plugin do android e tente reinstalar tambem… se você já fez isso realmente não sei o que pode ser… indico instalar o Eclipse (para verificar se o probleman não é o SDK) mas refaça o procedimento de instalação primeiro.

  10. Guilherme, parabéns pelo post!

    Eu gostaria de deixar meu listview em alto relevo, ou seja, causar um efeito similar ao que o aplicativo do Twitter e Facebook fazem. Tentei achar uma forma de colocar uma sombra, porém não tive sucesso. Você pode me ajudar?

    Obrigado.
    Denisson.

  11. Só um detalhe, vc cria o ListView com o id “tela_consulta_listView”. E depois invonca um ListView no código usando o id “list”. Isso ocasionaria um erro, não?

      1. Cara, eu não sei o que fiz de errado, mas eu criai um projeto igual ao teu e aqui não dá certo. já tentei ver todos os detalhes e continua dando errado. Pelo que vi, o problema é o método createListView(), pois se eu comento a chamada ao método, a aplicação não dá erro, mas também não aparece nada no ListView, logicamente. Mas se eu chamo esse método, então é gerado o erro Unfortunately app has stopped. Tu já tentou fazer um projeto seguindo esse turorial pra ver se dá certo? Será que não tem mais alguma alteração que tu esqueceu de mencionar? Sei lá…

  12. Eu já baixei o teu projeto, ele executa sem maiores problemas, ou seja, sou eu que to fazendo algo errado aqui ainda. Eu já copiei as imagens para as pastas res/drawable do meu projeto, o problema não é esse. Na verdade, não tem nenhum erro de compilação. É só falha na execução do app mesmo. Vou depurar melhor aqui e te aviso quando conseguir e porque não estava conseguindo. Obrigado.

  13. Cara, como eu falei, era eu que estava fazendo merda aqui mesmo. Fui pego pelo xml. Na hora de digitar, eu coloquei android.id=”@+id/imagemview”, ou seja, coloquei ponto ao invés de dois pontos antes de id. Pior que isso não gera erro, só um warning, que eu não estava dando muita bola. E o pior que mesmo assim é gerado na classe R um id imagemview, mas o aplicativo não executa. Esse é o problema de querer digitar tudo e não só copiar e colar, mas eu to preferindo fazer assim, já que to aprendendo aogra. Valeew

  14. amigo, ótimo tutorial, implementei aqui e funcionou perfeitamente, mas eu tenho uma dúvida como eu faço para quando eu adicionar um item novo na lista ele ganhar foco na lista ou no minimo ser posicionado na parte visivel da lista, já tentei por vários métodos da ListView mas sem sucesso, no adapter não encontrei nada que pudesse me ajudar, vc poderia me dar uma luz?

  15. Muito bom!

    Queria sua ajuda pois estou desenvolvendo meu TCC, é uma aplicação médica bem simples onde são listados medicamentos e posso realizar várias buscas por diferentes atributos do medicamento.

    já montei as telas só que estou com alguns problemas:

    1º não estou conseguindo trazer a lista dos medicamentos para ficar embaixo do campo de busca:

    me ajude a tentar resolver esse problema e se possível os próximos, desde já agradeço muito, muito mesmo.

    Não Android na faculdade só no livro por isso estou com esse problemas simples.

    1. Antonio para fazer uma lista com um campo e bem simples segue o xml da tela:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:orientation="vertical"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
      >
          <LinearLayout 
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
          >
              <EditText  
                  android:id="@+id/ed"
                  android:layout_width="wrap_content" 
                  android:layout_height="wrap_content" 
                  android:layout_weight="1" 
              />
              <Button
                  android:id="@+id/bt"
                  android:layout_width="wrap_content" 
                  android:layout_height="wrap_content" 
                  android:text="Buscar"
              />
          </LinearLayout>
          
          
          <ListView
              android:id="@+id/lista"
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent"
              />
          
      </LinearLayout>
      

      O resto é simples (preencher a lista), se você seguir esse tutorial você consegue e antes da uma estudada nesse :
      https://helpdev.com.br/2011/05/24/android-criando-um-listview/

      1. Obrigado Guilherme, só que eu quero pegar esses dados para exibir na lista em ordem alfabética a partir do meu banco já existente. podes me ajudar?

  16. Guilherme, ficou muito bom seu tutorial só uma duvida eu consegui adicionar imagens do banco, tudo certinho só não consigo adicionar em cima um edittext para poder fazer pesquisa, qndo eu adiciono ele duplica o edit … como eu poderia fazer isso ? já procurei em tudo que é site e não achei nada

    1. O Layout ficaria assim:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
      >
          <EditText 
              android:id="@+menu_lateral/find"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:hint="Pesquisa de usuários..."
          />
          
          <ListView
              android:id="@+menu_lateral/list_view"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:dividerHeight="2sp"
          />
       
      </LinearLayout>
      

      Seria isso?

  17. Prezado amigo:

    Gostaria de saber se você pode me dar uma luz sobre um problema que estou tendo com uma listview.

    Tenho o seguinte código, da minha estrutura xml, para minha atividade inicial:
    [code]
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:background="@drawable/bkg2" >

    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:background="#000000"
    android:textColor="#ffffff"
    android:textSize="28sp"
    android:gravity="center_horizontal"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">
    </TextView>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
    android:contentDescription="@string/desctopo"
    android:id="@+id/sample_image2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@drawable/topo"
    android:scaleType="fitXY">
    </ImageView>

    <TextView
    android:id="@+id/sample_title"
    android:text="@string/desctopo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffffff"
    android:textSize="12sp"
    android:background="#AA000000"
    android:padding="5dp"
    android:layout_alignParentLeft="true"
    android:layout_alignBottom="@id/sample_image2">
    </TextView>

    </RelativeLayout>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ListView
    android:id="@+id/mainListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="40dip" >
    </ListView>

    </RelativeLayout>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
    android:contentDescription="@string/desctopo"
    android:id="@+id/sample_image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@drawable/footer2"
    android:scaleType="fitXY"
    android:layout_alignParentBottom="true" >
    </ImageView>

    <TextView
    android:id="@+id/sample_title2"
    android:text="@string/desctopo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffffff"
    android:textSize="12sp"
    android:background="#AA000000"
    android:padding="5dp"
    android:layout_alignParentLeft="true"
    android:layout_alignBottom="@id/sample_image">
    </TextView>

    </RelativeLayout>

    </LinearLayout>
    [/code]

    Como pode ser visto, tenho uma listview, no meio do meu layout.
    Depois, tenho outro layout xml, descrevendo a entrada individual dos ítens da listview:
    [code]

    <TextView xmlns:android="http://schemas.android.com/apk/res/android&quot;
    android:id="@+id/rowTextView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="24sp"
    android:textColor="#ffffff" >
    </TextView>
    [/code]

    Em meu código, de minha main activity. java, tenho:

    [code]
    // Find the ListView resource.
    mainListView = (ListView) findViewById( R.id.mainListView );

    // Create and populate a List of names.
    String[] veiculos = new String[] { "Veículos Automotores e Ônibus Elétricos", "Reboques e Semi-Reboques", "Ciclomotores", "Motonetas, Motocicletas e Triciclos",
    "Quadriciclos", "Tratores de Rodas e Mistos", "Tratores de Esteiras"};
    ArrayList<String> veiculosList = new ArrayList<String>();
    veiculosList.addAll( Arrays.asList(veiculos) );

    // Create ArrayAdapter using the list.
    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, veiculosList);

    // Set the ArrayAdapter as the ListView’s adapter.
    mainListView.setAdapter( listAdapter );
    [/code]

    Tudo funciona muito bem, mas, se eu tento colocar qualquer outro elemento no arquivo xml dos itens do listview, o programa dá pau (trava o android e tenho que desligar o aparelho e ligar de novo).

    Agradeceria alguma sugestão, para entender o que está acontecendo.
    Estou iniciando em programação java e Android, portanto peço um pouco de paciência comigo.

    Obrigado.

  18. O erro é o que descrevi, o Android trava e tenho que desligar o tablet.
    Este erro acontece assim que executo o programa.

    Veja:

    Com o código do arquivo assim, não dá erro:
    [code]
    <TextView xmlns:android="http://schemas.android.com/apk/res/android&quot;
    android:id="@+id/rowTextView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="24sp"
    android:textColor="#ffffff" >
    </TextView>
    [/code]

    Com o código assim, dá erro ( o tablet trava):
    [code]
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_selector"
    android:orientation="horizontal"
    android:padding="5dip" >

    <TextView
    android:id="@+id/rowTextView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="24sp"
    android:textColor="#ffffff" >
    </TextView>

    <!– Rightend Arrow –>
    <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/arrow"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"/>

    </RelativeLayout>
    [/code]

    Meu arquivo MainActivity.java é:
    [code]
    package com.ssaguiar.inspecaoveicular;

    import java.util.ArrayList;
    import java.util.Arrays;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.view.View;
    import android.widget.AdapterView.OnItemClickListener;
    import android.content.Intent;
    import android.content.pm.PackageManager;

    import android.hardware.Camera;
    import android.widget.ImageView;
    import android.widget.VideoView;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Toast;

    public class MainActivity extends Activity {

    private ListView mainListView ;
    private ArrayAdapter<String> listAdapter ;

    private Camera camera;
    private int cameraId = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setTitle("Sistema de Inspeção Veicular – (c)2013 – ssaguiar");

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

    setTitle("No camera on this device");
    }
    else
    {
    setTitle("Camera found on this device");
    }

    // Find the ListView resource.
    mainListView = (ListView) findViewById( R.id.mainListView );

    // Create and populate a List of names.
    String[] veiculos = new String[] { "Veículos Automotores e Ônibus Elétricos", "Reboques e Semi-Reboques", "Ciclomotores", "Motonetas, Motocicletas e Triciclos",
    "Quadriciclos", "Tratores de Rodas e Mistos", "Tratores de Esteiras"};
    ArrayList<String> veiculosList = new ArrayList<String>();
    veiculosList.addAll( Arrays.asList(veiculos) );

    // Create ArrayAdapter using the list.
    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, veiculosList);

    // Set the ArrayAdapter as the ListView’s adapter.
    mainListView.setAdapter( listAdapter );

    OnItemClickListener listener = new OnItemClickListener() {

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    switch( position )
    {
    case 0:
    Intent myIntent = new Intent(view.getContext(), automotores.class);
    startActivityForResult(myIntent, 0);
    break;
    case 1:
    Intent myIntent1 = new Intent(view.getContext(), reboques.class);
    startActivityForResult(myIntent1, 0);
    break;
    case 2:
    Intent myIntent2 = new Intent(view.getContext(), ciclomotores.class);
    startActivityForResult(myIntent2, 0);
    break;
    case 3:
    Intent myIntent3 = new Intent(view.getContext(), motonetas.class);
    startActivityForResult(myIntent3, 0);
    break;
    case 4:
    Intent myIntent4 = new Intent(view.getContext(), quadriciclos.class);
    startActivityForResult(myIntent4, 0);
    break;
    case 5:
    Intent myIntent5 = new Intent(view.getContext(), tratoresrodas.class);
    startActivityForResult(myIntent5, 0);
    break;
    case 6:
    Intent myIntent6 = new Intent(view.getContext(), tratoresesteiras.class);
    startActivityForResult(myIntent6, 0);
    break;
    }

    }

    };

    mainListView.setOnItemClickListener(listener);
    }

    }

    [/code]

    1. Pode ser problema com o RelativeLayout, tente usar o LinearLayout… mas mesmo assim não da para descobrir o erro, conecte-o ao ddms/monitor e me informe o erro exato! somente com o código é complicado avaliar.

  19. Os códigos xml referem-se ao arquivo simplerow.xml.

    O arquivo activity_main.xml é:
    [code]
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:background="@drawable/bkg2" >

    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:background="#000000"
    android:textColor="#ffffff"
    android:textSize="28sp"
    android:gravity="center_horizontal"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">
    </TextView>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
    android:contentDescription="@string/desctopo"
    android:id="@+id/sample_image2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@drawable/topo"
    android:scaleType="fitXY">
    </ImageView>

    <TextView
    android:id="@+id/sample_title"
    android:text="@string/desctopo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffffff"
    android:textSize="12sp"
    android:background="#AA000000"
    android:padding="5dp"
    android:layout_alignParentLeft="true"
    android:layout_alignBottom="@id/sample_image2">
    </TextView>

    </RelativeLayout>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ListView
    android:id="@+id/mainListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="40dip" >
    </ListView>

    </RelativeLayout>

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
    android:contentDescription="@string/desctopo"
    android:id="@+id/sample_image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@drawable/footer2"
    android:scaleType="fitXY"
    android:layout_alignParentBottom="true" >
    </ImageView>

    <TextView
    android:id="@+id/sample_title2"
    android:text="@string/desctopo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffffff"
    android:textSize="12sp"
    android:background="#AA000000"
    android:padding="5dp"
    android:layout_alignParentLeft="true"
    android:layout_alignBottom="@id/sample_image">
    </TextView>

    </RelativeLayout>

    </LinearLayout>
    [/code]

  20. OLá ótimo post, porém tenho uma dúvida, se eu quiser carregar essa listview direto de um banco de dados como eu faria??
    por exemplo eu teria uma primeira tela com um botão pesquisar e ao clicar nesse pesquisar eu queria que em outra tela aparecece a listView com os dados carregados. Como eu faria isso Guilherme?

      1. Olá guilherme sempre ótimos posts, eu tenho um banco de dados.Vou lhe explicar meu appteste
        Ele tem 2 spinners 1 que contem os nomes escola, praça, hospital, e o outro spinner tem os bairros da cidade. BairroA, BairroB…E um botão pesquisar.
        De maneira que ao selecionar no spinner 1, escola. p.ex. e no spinner2 o bairroB.. Em uma outra tela eu queria que apareceçem todos as escolas do bairro B.

        Eu criei um banco de dados com 4 tabelas, a tabela de escola, praça, hospital e uma outra para os bairros, sendo cada tabela em 4 classes diferentes com os mesmos nome EscolaDAO,PracaDAO,HospitalDAO, BairroDAO… fiz o select, join para cada uma. Só que eu não estou conseguindo implementar um método para que minha MainActivity consiga ler esses dados para fazer um filtro de pesquisa e jogue em uma ListView em outra tela.
        Vc tem algum tutorial para fazer isso?
        Qualquer outra informação adicional que vc queira eu posso estar lhe enviando por email. Assim fica melhor 🙂
        Um grande Abraço, eu amo seu blog

        1. Obrigado pelo carinho Jessica… bom vamos ver…
          1- Você já esta conseguindo trazer os dados do banco?
          2- Você está populando os spinner?
          3- Quando clica no botao pesquisar você está conseguindo pegar os valores do spinner?
          Depois de me responder isso vou saber em que parte você está…

  21. Guilherme sim populei os spinners, porém não estou conseguindo pegar os valores dos spinners pelo clic do botão. Nem conseguindo trazer os dados vindos do banco.

  22. Olá Guilherme, estou com um problema com a criação da lista com um numero grande de itens, tenho que colocar mais de 1000 itens na lista, porem quando chamo o método ele trava o app… Tens ideia do que posso fazer?
    Abraço

  23. Boa Noite Guilherme, muito bom o seu post mas estou com uma dúvida.

    No caso eu gostaria de saber se é possível a partir do item que for selecionado ele abra subitens como se fosse um menu mesmo.

    Dividindo assim categorias e subcategorias.

    1. Tudo é possível, porem se você quer abrir um submenu no próprio Menu, fica muito complicado MESMO!, pois voce deve customizar cada item no seu Adapter, usando um layout diferente e customizado! o recomendado é abrir uma outra tela que contenha uma lista com suas opções.

  24. Olá Guilherme, tenho um conjunto de imagens no meu servidor. e carrego essas imagem para o componente Imageview atraves de URL. Gostaria de saber se voce tem algum exemplo usando um listview carregando as imagens do do servidor e nao da res/drawable/. Muito obrigado/

  25. Bom dia Guilherme, tenho uma dúvida em relação a outros assuntos. tenho uma aplicação e queria implementar um sistema push, porém não gostaria de usar o GCM pois pretendo integrar WP,IOS E Android. o que você me indica? Obrigado!

  26. Amigo, Boa Tarde! Ja estou ficando meio maluco com meu projeto e preciso de sua ajuda. tenho 2 telas, uma com produtos e outra de vendas, a de produtos eu mostro os dados pegando do banco, ate ai tudo bem, mas como posso pegar esses dados e jogar na tela de vendas, lá tenho uma listview, no caso tem como fazer isso por tela? ou pelo banco? tem como mostrar as 2 opções?

  27. Muito bom o post. Estou com uma dúvida. Tenho as imagens e gravo no banco apenas o nome da imagem. As imagens precisam estar no res/ drawable? Como que faço para mostrar as imagens junto com o nome no ListView.

  28. Parabéns pelo post Guilherme!

    Um dúvida, estou com um listview dentro de um fragment gostaría de mostrar alguns campos na lista ao abrir e se clicar em uma imagem (exemplo : sinal de mais) mostrar outros, pode me ajudar. Sem utilizar o expandable ou ir para outra tela.

    1. Você pode fazer da seguinte forma caso nao queira usar o expandable, utilizando o Adapter e um item personalizado para seu ListView, você pode incluir seu botão no layout e incluir no mesmo layout o que você queira exibir caso clique no botão, porem você deixa ele com android:visibility=”gone”, dentro do proprio adapter você ao percorrer cada item passando pelo getView() você define um setOnClickListener para seu botão (seu sinal de mais) e no listener você pega uma referencia da view e da um setVisibility(View.VISIBILITY), você pode usar um bt.setTag(viewSerExibido) passando a view que voce quer exibir e no metodo do onClick você pega ela de volta com o view.getTag().setVisibl… Qualquer coisa me envie um email. Att.

  29. Olá,primeiramente parabéns pelo post, me ajudou muito!!!
    mas, pode me tirar uma duvida?
    O que eu devo fazer para exibir no meu listView 4 itens, no exemplo acima temos uma imagem e um campo de texto.
    No meu caso preciso exibir uma imagem (igual do tutorial) e mais 3 atributos que definem essa minha imagem mas só estou conseguindo exibir um dos itens atrves do comando:

    itemHolder.txtTitle = ((TextView) view.findViewById(R.id.bluec));

    Att.

  30. Olá, obrigado pelo post, muito bom.
    No meu caso, meu projeto só roda se eu tirar essa linha;
    listView.setOnItemClickListener(this);

    quando mantenho ele simplesmente não roda.
    tem idéia do pode ser?

  31. Parabéns pelo tutorial, consegui resolver umas coisas baseados na idéia do tutorial. Queria aproveitar para perguntar o seguinte, como eu faria para ao clicar em um item da lista e colocar uma cor nele ou tornar visível um item daquela view(até ai eu consegui), mas quando eu clico em outro item (ou clico no botao voltar) quero que faça a mesma coisa no novo item clicado (até ai tudo bem), mas quero que o item anterior “volte ao normal”, ou seja, volte a cor padrão ou oculte o item que tornei visível anteriormente. tem como?
    Para ilustrar melhor o exemplo, é algo igual a lista de contatos, quando eu clico em um nome, ele mostra “detalhes”, algumas infomarções (acho q uma view que estava oculta) e quando clico em um novo nome, e mostra os dados do novo nome e apaga a da anterior.

  32. Oi Guilherme, sou novo em Java. Copiei e colei todo o projeto mas está com um problema que não consigo identificar. Só aparece o texto no listview sem a image. Colei no drawable umas fotos do celular(jpg). Também gostaria de saber a possibilidade de pegar todos os itens(fotos e nome da mesma) em um loop ao invés de uma a uma. Muito Grato.

Deixe uma resposta para Léo Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para o topo