[Android Studio] Aula 18 – Agenda de Contatos – Pesquisando Contatos e Customizando o ArrayAdapter

Share Button

Mais uma vídeo aula disponibilizada.

Nesta vídeo aula eu demonstro como utilizar a interface TextWatcher para capturar os dados que são digitados no componente EditText e também demonstro como customizar o layout do componente ListView atráves da classe ArrayAdapter.

Página do facebook; http://goo.gl/oOdXpp
Projeto: http://goo.gl/4qcoLU

Críticas e sugestões serão bem vindas, pois somente assim podemos melhorar.

Comments

comments

18 Comments

  1. Olá mestre tudo bem? Está de mais esta série, muito obrigado professor. Gostaria de saber, como posso corrigir um bug relacionado a pesquisa, pois sempre que entro com os dados de um novo contado, e após salvar este e retornar a tela inicia, a pesquisa deixa de funcionar, e só retorna após eu fechar o APP e reabri-lo novamente. Eu só tenho esse erro vc pode me ajudar nisso?

    Grande abraço Paulo

    1. Consegui Professor uHUUuuHUUUu!

      Na Activity ActCadContato:

      -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=–

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {

      switch (item.getItemId()) {

      case R.id.mni_acao1:

      salvar();
      // corrige o bug de salvar e não pesquisar pois ele restaura o estado
      Intent intent = new Intent(this, ActContato.class);
      startActivity(intent);

      // finish(); <– remover

      break;

      case R.id.mni_acao2:

      excluir();
      // finish(); <– remover

      break;
      }

      // corrige o bug de excluir e não pesquisar
      // corrige o bug de salvar e não pesquisar pois ele restaura o estado
      Intent intent = new Intent(this, ActContato.class);
      startActivity(intent);
      }

        1. Bom dia. Não é necessário fazer isso, nas aulas seguintes eu demonstro como corrigir esse detalhe. Quando o Activity de cadastro é fechado e necessário configurar o filtro novamente.

          1. Maravilha professor ok, estou ansioso para saber como fazer isso. Usando essa “gambiarra” tenho problemas com o botão voltar, ele fica maluco chamando a Act abertas no passado pois não usei o “finish();” para fechar 🙁 ….

            Estou fazendo um APP anotações das configurações de uma maquina que uso muito no meu trabalho, eu utilizava uma agenda e caneta pra fazer isso, mas agora estudando muito seu material aqui no blog tenho evoluído bastante. Mas tenho sempre este problema em qualquer projeto que eu implemento o campo busca que aprendi aqui no blog.

            Valeu mestre aguardo esse fix.

  2. Boa tarde Professor Paulo, antes de falar da minha duvida quero lhe agradecer pelos videos que são de ótimo conteúdo, aprendi muinto com as aulas e recomendo a todos que estão começando com o android.

    Bom, a minha duvida é referente a aula 18 na classe “ContatoArrayAdapter”.
    É que eu usei as aulas de base para outro projeto, com objetivo de absorver mais o conteúdo.

    static class ViewHolder
    {
    TextView txtCor;
    TextView txtNome;
    TextView txtCama;
    }

    O txtCama receberia um item de um Spinner “spnCama” do formulário, que estaria na classe actCadCadastro.
    Na tela que lista os contatos actContatos aparece a cor o nome e no lugar do item aparece 0.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

    View view =null;
    ViewHolder viewHolder= null;

    if (convertView == null)
    {
    viewHolder= new ViewHolder();

    view = inflater.inflate(resource, parent, false);

    viewHolder.txtCor= (TextView)view.findViewById(R.id.txtCor);
    viewHolder.txtNome= (TextView)view.findViewById(R.id.txtNome);
    “””””viewHolder.txtCama= (TextView)view.findViewById(R.id.txtCama);”””””””

    view.setTag(viewHolder);

    convertView= view;
    }
    Tentei alterar esse trecho mas não obtive sucesso.

    1. Você que tem que tratar como os dados serão exibidos, por exemplo, se no banco de dados você esta gravando os valores 0 ou 1 para identificar os itens selecionados no spinner, então ao construir seu array adapter você deve também tratar ele com os valores que devem ser exibidos, realizar um teste, por exemplo, se o valor for 0 escreva Não, se o valor for 1 escreva Sim.

  3. Correto professor, os dados que serão exibidos não estão tratados, por isso é apresentado a posição do itém selecionado em vez de apresentar o texto. Vou realizar o teste. Obrigado.

    1. Quando você grava somente valores simples no banco, tais como, 0, 1 ou A e B, esse valores devem ser tratados na hora de exibir em uma lista.
      Mas qualquer coisa você pode perguntar novamente e assim que possível eu responderei você.
      Um grande abraço

      1. Boa noite professor, ainda tenho uma duvida, tentei salvar os dados do spinner assim
        contato.setCama(String.valueOf(spnCama.getSelectedItem()));
        com getSelectedItem, contato.setCama(String.valueOf(spnCama.getSelectedItemPosition()));
        deu certo aparece o item na view, mas ao seleciona-lo pra eu ver o cadastro não muda de tela e aparece um erro. Estou meio perdido como devo tratar estes dados.

          1. É um force close, the application (process (nome do pacote)) has stopped unexpectedly. Please try again.
            No logcat esta assim, Caused by: java.lang.NumberFormatException: unable to parse ‘Aux.’ as integer , ( ‘Aux.’ é o item do spinner selecionado.)

          2. Pelo seu erro você esta convertendo uma String, o método valueOf converter valores inteiros em Strings, então,
            basta fazer assim:
            contato.setCama(spnCama.getSelectedItem().toString());

  4. Olá Paulo, estou aprendendo muito com essa serie que vc nos ensina passo a passo. sou iniciante e sempre quis saber como implementar uma busca em um app. muito obrigado mesmo por postar seus videos 😉

    Paulo eu gostaria de saber se existe alguma forma de mostrar a posição real de um item da lista após usar a busca, porque eu sempre recebo a posição “0” mas se eu clicar em um item sem usar a busca recebo a posição real do item na lista.

    existe alguma forma de receber essa posição usando o Search mesmo que o item buscado esteja no topo e não seja tratado como uma posição inicial?

    1. Acredito que não, pois quando você realizar a busca a lista é reajustada com os novos itens filtrados, mudando a posição dos índices dos itens.

      1. Foi o que imagine Paulo, o que eu consegui fazer foi pegar o id no banco de dados verificar em qual linha ele está e com essa posição manipular o que eu queria. vou postar o método aqui talvez possa ajudar alguém.

        public static long pegaLinhaDoId(Context context, long id) throws Exception { //método para pegar a posição da linha do um _id no banco de dados
        long res = -1;
        DataBase dataBase = new DataBase(context);
        SQLiteDatabase conn = dataBase.getWritableDatabase();
        String query = “SELECT COUNT (*) FROM ” + Dados.TABELA + ” WHERE ” + Dados.ID + “<=" + id;
        res = conn.compileStatement(query).simpleQueryForLong();

        return res;
        }

        e eu chamo ele no meu …AdapterView.OnItemClickListener()…

        pegaLinhaDoId(getBaseContext(), (dados.getId() – 1)); //-1 porque o banco tem auto incremento começando os IDs em 1

        Paulo tive que fazer assim pois quando eu deleto um registro do banco fica uma lacuna entre os IDs devido ao incremento da chave primaria. dai assim não tive problemas e resolveu meu problema com a busca que sempre retornava a posição da linha de um item com um número errado.. fica a dica pessoal 🙂

        Obg Professor, inté

  5. Oi Paulo tudo bem?

    Como ficaria para implementar o RecyclerView pois ListView foi substituído por este, tentei de várias formas adaptar o ViewHolder que vc ensina mas não consigo.

    Seria possível vc fazer uma extensão da série agenda com mais um vídeo explicando como implementar o RecyclerView “neste mesmo projeto”?

    Desde já, agradeço.

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: