Criando um ListView personalizado no Android

Faaala galera!

Aqui vamos nós para mais um tutorial. Hoje vamos aprender como podemos customizar um ListView!

Se você ainda não viu o último tutorial da série, aproveite e aprenda um pouco mais sobre como manipular dados de um formulário em Android. Se você continua é preguiçoso e apenas baixou o projeto, importe-o para sua workspace. Para tal, vá em File → Import… → Existing Projects into Workspace, dentro de General.

Bora lá começar?!

Criando um ListView personalizado no Android

Vamos começar alterando nosso layout atual adicionando mais dois campos EditText, com os IDs ano e cor. Não se esqueça de criar as strings constantes ano e cor, no arquivo res/values/strings.xml.

<EditText
       android:id="@+id/ano"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:ems="10"
       android:hint="@string/ano" />
 
   <EditText
       android:id="@+id/cor"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:ems="10"
       android:hint="@string/cor" />

PS: não vou adicionar o código inteiro para não ficar muito extenso. Se você está com preguiça dificuldades, siga todo o tutorial para aprender, é claro, e depois baixe o projeto no final.

Abra a nossa Activity principal ListaCarros. Nela vamos instanciar os campos que acabamos de criar.

EditText ano, cor;
ano = (EditText) findViewById(R.id.ano);
cor = (EditText) findViewById(R.id.cor);

Agora vem a parte principal do nosso tutorial. Para customizar nossa lista, são 3 passos: criar um layout para as linhas da lista, criar as classes para adaptar a lista, e implementar a adaptação.

Primeiramente, vamos criar o layout das linhas em res/layout/linha_carro.xml. Seguindo as alterações já realizadas, vamos criar um layout básico, que irá exibir as informações de nome, ano e cor dos veículos.

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
 
   <TextView
       android:id="@+id/nomeCarro"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       android:text="TextView"
       android:textStyle="bold" />
 
   <TextView
       android:id="@+id/anoCarro"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/nomeCarro"
       android:text="TextView" />
 
   <TextView
       android:id="@+id/corCarro"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignBaseline="@+id/anoCarro"
       android:layout_alignBottom="@+id/anoCarro"
       android:layout_alignParentRight="true"
      android:text="TextView" />
 
</RelativeLayout>

O segundo passo é um pouco mais complicado. Precisamos criar 2 classes que irão adaptar as listas. Vamos chama-las de Adaptador, que estende ArrayAdapter, e Armazenador. Como o nome já diz, uma classe faz a adaptação e a outra armazena as informações nos lugares corretos. Deixei o código todo comentado para facilitar pra mim pra você entender.

// Classe responsável por criar um adaptador para as linhas do ListView
class Adaptador extends ArrayAdapter {
                Adaptador() {
                               // Chama o construtor da classe ArrayAdapter, passando a classe atual,
                               // um layout padrão e a lista dos itens que serão adicionados.
                               super(ListaCarros.this, android.R.layout.simple_list_item_1, listaCarros);
                }
 
                // Vamos sobrepor o método getView, pois é aqui que vamos chamar nosso layout
                // customizado
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
 
                               // Instanciando os itens necessários: linha atual, classe Armazenador
                               // e o conteúdo que será inserido
                               View linha = convertView;
                               Armazenador armazenador = null;
                               final String[] item_linha = (String[]) listaCarros.get(position);
 
                               // Neste trecho é que chamaos nosso layout. Usamos o método getLayoutInflater()
                               // e depois indicamos o layout. Também já inserimos os dados na posição atual
                               // através da classe Armazenador.
                               if (linha == null) {
                                               LayoutInflater inflater = getLayoutInflater();
                                               linha = inflater.inflate(R.layout.linha_carro, null);
                                               armazenador = new Armazenador(linha, position);
                                               linha.setTag(armazenador);
                               } else {
                                               armazenador = (Armazenador) linha.getTag();
                               }
 
                               // Apenas uma "firula". Ao clicar na linha, será exibida uma mensagem
                               // com o nome do carro. Coloque seu código dentro do método onClick().
                               linha.setOnClickListener(new OnClickListener() {
                                               @Override
                                               public void onClick(View v) {
                                                               Toast.makeText(getApplicationContext(), item_linha[0], Toast.LENGTH_SHORT).show();
                                               }
                               });
 
                               // Agora sim, vamos jogar os dados nos seus respectivos campos do layout da linha
                               armazenador.popularFormulario((String[]) listaCarros.get(position));
 
                               // Retorno obrigatório do método
                               return linha;
                }
}
 
// Classe responsável por "jogar" os dados nos campos corretos
class Armazenador {
                // Declaração dos campos
                private TextView nomeCarro = null;
                private TextView anoCarro = null;
                private TextView corCarro = null;
 
                // Construtor que instancia os campos
                Armazenador(View linha, int position) {
                               nomeCarro = (TextView) linha.findViewById(R.id.nomeCarro);
                               anoCarro = (TextView) linha.findViewById(R.id.anoCarro);
                               corCarro = (TextView) linha.findViewById(R.id.corCarro);
                }
 
                // Método para "jogar" os textos nos respectivos campos
                void popularFormulario(String[] c) {
                               nomeCarro.setText(c[0]);
                               anoCarro.setText(c[1]);
                               corCarro.setText(c[2]);
                }
}

NOTA: alguns warnings serão exibidos, porém não influenciam em nada.

Terceiro e último passo: vamos programar nossas classes de adaptação. É preciso modificar o tipo de algumas variáveis, pois antes existia apenas 1 informação (nome do carro), e agora irão existir 3.

List<String[]> listaCarros;
ArrayAdapter<String[]> adaptador;

Precisamos também trocar a instância do adaptador, e a ação do botão Salvar.

adaptador = new Adaptador();
salvar.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                               String[] c = {veiculo.getText().toString(), ano.getText().toString(), cor.getText().toString()};
                               listaCarros.add(c);
                               adaptador.notifyDataSetChanged();
                }
});

Beleza, execute o código e seja feliz!

Criando um ListView personalizado no Android

Considerações Finais

Nosso projeto começa a ficar interessante. Aprendemos a customizar nossa lista de acordo com o necessário. No próximo tutorial vamos aprender a salvar os dados em banco de dados!

Baixe o projeto atual aqui.

Até mais, pessoal!

Lista de Redes Sociais ao redor do mundo

Hello people!  Tudo joinha? Então aqui vai um post quentinho do forno pra você que é sociável e adora se comunicar na internet.  Ok, confesso esse post é pouco pra que é da área de Marketing Digital e sabe bem que a lista é interminável.

A ideia principal é te apresentar algumas redes sociais e acrescentar novas sempre que possível, assim você poderá contribuir e ficar antenado nas Redes Sociais do seu gosto.

Por favor se você tem alguma e gostaria de compartilhar comente abaixo. Espero que esse material possa te ajudar nos estudos. Até mais! 😉

Lista de Redes Sociais

Músicos e amantes de Música <3

Blip.fm
Rede social com temática musical, onde seus usuários são tratados como DJs.

Last.fm
Rede social voltada para a música. Forte presença brasileira (mais de 30.000 usuários se declaram brasileiros).

MySpace
Geral.

Palco Principal
Rede social de música.

Purevolume
Estados Unidos da América.

ShareTheMusic
Plataforma virtual para a troca legal e gratuita de música.

Spotify
Serviço de música comercial em streaming.

Países

Bebo
Rede popular na Inglaterra.

Cyworld
Coreia do Sul.

Mixi
Apenas em japonês.

Netlog
Rede Social voltada para jovens adultos europeus, de idades entre 14 e 24 anos.

Mirtesnet
Rede Social 100% Brasileira criada em 2013.

Colecionadores

Colnect
Rede social de Colecionadores do Mundo Inteiro.

Viajantes

CouchSurfing
Rede social voltado a pessoas que gostam de viajar e que gostam de hospedar viajantes em suas casas.

Leitores

Skoob
Rede social para leitores.

Filmes e Séries

Filmow

Rede social com foco em filmes e séries.

Amantes de Fotografia

Flickr
Compartilhamento de fotografias.

Instagram
Rede social online de compartilhamento de foto e vídeo que permite aos seus usuários tirar fotos e vídeos, aplicar filtros digitais e compartilhá-los em uma variedade de serviços de redes sociais.

Pinterest
Rede social de compartilhamento de fotos.

Emprego

LinkedIn
É um site para busca de colegas e ex-colegas de profissão.

Questionários

Formspring
Rede social focada em perguntas.

Ask.fm
Rede social para perguntas e respostas entre seus usuários.

Geo Localização

Foursquare
Rede social e de microblogging com ênfase na geolocalização.

Waze
Rede social colaborativa, permite compartilhar informações sobre transito, se baseia em localização geográfica.

Neutra

Friendica
Rede social descentralizada com ênfase em segurança, privacidade e comunicação com outras redes e serviços.

Jogos

Gaia Online
Anime e Jogos.

Bichos de Estimação

GoPets
Bichos de estimação virtuais.

Idiomas

Kaveris
Rede social para quem fala português.

Friendster
Geral.

Microblogging

Twitter

Rede social de microblogging.

Tumblr
Rede social (Microblogging).

Projetos

Moovia
Rede Social colaborativa voltada para o desenvolvimento de projetos em equipes.

Relacionamento

Par Perfeito
Rede de Relacionamento.

Sonico
Possui Fórum/Galeria. Site de relacionamento voltado para os povos de língua portuguesa, espanhola e inglesa.

Temas

Skyscrapercity
Rede Social para discussão de temas.

Voluntários

V2V
Rede social que reúne voluntários de acordo com suas afinidades e disposições para agir.

História

YuBliss

Rede social para auto-avaliação através de mitos modernos e histórias.

Video

Stayfilm
Rede social que permite a produção e compartilhamento de filmes com fotos e vídeos do usuário. Produção automática online com trilha sonora, efeitos e qualidade de cinema.

Youtube
Rede social e compartilhamento de vídeo.

Geral

Blaving
Rede social da PMovil.

Facebook
Maior rede social do mundo.

Google+
Compartilhamento de Conteúdo.

Hi5
Geral.

imeem
Instant messaging.

Mingle
Geral.

LiveJournal
Blogging.

VK

Rede social.

Wallop
Rede social da Microsoft.

Ello
é uma rede social virtual anti-publicitária.

Enviando E-mail com Objective-C

Bom pessoal vamos começar mais um post, hoje vamos desenvolver uma ferramenta extremamente útil e simples, vamos enviar um e-mail sem precisar sair de nosso aplicativo.

Vamos começar

Vamos começar com uma sinlge View e vamos colocar 1 botão nela, e não precisamos de mais nada em nossa interface.

TelaEmail

Para enviar e-mail é necessário que importemos o framework MessageUI ele será o responsável por enviar nossos dados, com a classe importada precisamos agora criar um componente e vamos também importar nosso delegate, nosso arquivo .h está assim:

#import <UIKit/UIKit.h>

#import <MessageUI/MessageUI.h>

@interface ViewController : UIViewController <MFMailComposeViewControllerDelegate>{

MFMailComposeViewController *formularioEmail;

}

  • (IBAction)envia:(UIButton *)sender;

Criamos também a action do botão que fará o disparo do e-mail. Agora vamos para nosso .m onde implementaremos o resto de nosso código:

Dentro de nossa action vamos implementar o seguinte código.

// dentro de nossa action vamos colocar os dados para enviar

// pré defini destinatários (não é necessário)

// NSArray *destinatario = [[NSArray alloc]initWithObjects:@”contato@yesbr.com.br”, nil];

//

// [formularioEmail setToRecipients:destinatario];

formularioEmail = [[MFMailComposeViewController alloc]init];

formularioEmail.mailComposeDelegate = self;

// setSubject adiciona um assunto ao email

[formularioEmail setSubject:@”Email de teste”];

// temos agora o corpo da mensagem

[formularioEmail setMessageBody:@”Enviamos nossa mensagem” isHTML:NO];

[self presentModalViewController:formularioEmail animated:YES];

A vantagem de usar esses métodos que já temos tudo criado pelo celular apenas chamamos o formulário de e-mail, o que torna todo o processo muito mais simples, e intuitivo para o usuário.

Os comentários já deixam o código bem fácil de entender mas vamos explicar apenas a questão de destinatários, em algumas situações, o aplicativo tem que enviar e-mail para um destinatário específico por exemplo um formulário de contato enviará o e-mail para o contato, nessa situação podemos implementar o setToRecipents e colocamos os destinatários em um array para poder enviar o e-mail a vários usuários por vez.

Feito a implementação de nossa ação para envio vamos obter a resposta se nosso e-mail foi ou não enviado. Para isso vamos implementar o seguinte método nele com base na resposta celular mostra um alerta se o e-mail foi ou não enviado com sucesso.

-(void)mailComposeController:(MFMailComposeViewController *)controller

didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{

UIAlertView *mensagem;

if (result) {

mensagem = [[UIAlertView alloc]initWithTitle:@”Enviado” message:@”Email enviado com sucesso” delegate:self cancelButtonTitle:@”ok” otherButtonTitles:nil, nil];

}

if (error) {

mensagem = [[UIAlertView alloc]initWithTitle:@”Erro” message:@”Erro ao enviar mensagem” delegate:self cancelButtonTitle:@”ok” otherButtonTitles:nil, nil];

}

[mensagem show];

[self dismissViewControllerAnimated:YES completion:nil];

}

Bom pessoal esse projeto foi extremamente simples, porém é bem interessante para implementar no seus apps.