Controle de Lista ListView – Uso Simples
Este é um controle muito usado.
O espaço da nossa tela é limitado, mas com este controle podemos exibir mais dados no visor.
Ao deslizar o dedo para cima ou para baixo, você pode trazer para a tela os dados que estavam fora dela.
Uso Simples
Crie um novo projeto TestListView.
Adicione o código abaixo na visualização para incluir um ListView.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>Code language: HTML, XML (xml)
Inicializar a Fonte de Dados
public class MainActivity extends AppCompatActivity {
// [葡萄牙语] Cursos de exemplo: "Introdução ao Java", "Introdução ao Android", "Introdução ao C#", "Linguagem C", "ASP.NET MVC"
private String[] courses = {"Introdução ao Java","Introdução ao Android","Introdução ao C#","Linguagem C","ASP.NET MVC"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,courses);
ListView listView = (ListView) findViewById(R.id.listview1);
listView.setAdapter(adapter);
}
}Code language: JavaScript (javascript)
Esses dados podem ser baixados da internet (por exemplo, via Web API), lidos de um banco de dados ou até mesmo definidos como um array de strings diretamente no código.
Os dados não podem ser passados diretamente para o ListView; é necessário um adaptador para intermediar.
O Android oferece muitos adaptadores. Aqui usamos o ArrayAdapter.
Usamos o android.R.layout.simple_list_item_1 como layout filho para o ListView.
É um arquivo de layout embutido no Android que contém apenas um TextView para exibir um texto.

Controle de Lista ListView – Personalizando a Interface
Exibir apenas um texto é um pouco simples demais
Podemos mostrar conteúdo mais rico nos itens da lista.
Adicionar uma Classe de Entidade Book
package com.foxdevelop.www.testlistview;
public class Book {
private String name;
private int imageId;
public Book (String name,int imageId)
{
this.name = name;
this.imageId = imageId;
}
public String getName()
{
return name;
}
public int getImageId()
{
return imageId;
}
}Code language: PHP (php)
Adicionar um Arquivo de Visualização para o Livro
<?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">
<ImageView
android:id="@+id/imageid"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="12dp"
/>
</LinearLayout>Code language: HTML, XML (xml)
Adaptador Personalizado
package com.foxdevelop.www.testlistview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class BookAdapter extends ArrayAdapter<Book> {
private int resource;
public BookAdapter(@NonNull Context context, int resource, @NonNull List<Book> objects) {
super(context, resource, objects);
this.resource = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Book book = getItem(position); // [葡萄牙语] Obtém o livro atual
View view = LayoutInflater.from(getContext()).inflate(resource,parent,false);
ImageView imageView = (ImageView) view.findViewById(R.id.imageid);
imageView.setImageResource(book.getImageId());
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(book.getName());
return view;
}
}Code language: JavaScript (javascript)
Inicializar a Fonte de Dados no onCreate da Atividade
package com.foxdevelop.www.testlistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Book> courses = new ArrayList<Book>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadBooks();
BookAdapter adapter = new BookAdapter(MainActivity.this,R.layout.booklistview,courses); // [葡萄牙语] Carrega recursos da classe de entidade
ListView listView = (ListView) findViewById(R.id.listview1);
listView.setAdapter(adapter);
}
private void LoadBooks()
{
// [葡萄牙语] Títulos traduzidos conforme o contexto original
courses.add(new Book("Primeiro na História do Pensamento Humano",R.drawable.access));
courses.add(new Book("Política da Fase de Exploração",R.drawable.book));
courses.add(new Book("Documento Precioso do Direito Antigo da Índia",R.drawable.bookmarks));
courses.add(new Book("Livro Didático de Direito Privado Romano Imperial",R.drawable.center));
courses.add(new Book("Conhecimento é Poder",R.drawable.date));
courses.add(new Book("Meu Código Civil Existirá Para Sempre",R.drawable.clock));
courses.add(new Book("Obra Clássica sobre a Democracia Americana",R.drawable.ftp));
courses.add(new Book("Livro Didático Autoritativo de Direito Internacional Ocidental",R.drawable.notes));
courses.add(new Book("A Obra Mais Próxima da Verdade Histórica",R.drawable.set));
courses.add(new Book("Um Espelho da Reforma Religiosa",R.drawable.energy));
courses.add(new Book("O Segredo da Teologia é a Antropologia",R.drawable.tux));
courses.add(new Book("Obra Famosa Apresentada à China há Mais de 300 Anos",R.drawable.science));
courses.add(new Book("Obra-prima Eterna que Retrata Hipócritas",R.drawable.joystick));
courses.add(new Book("Universidade de Prestígio sem Muros",R.drawable.center));
courses.add(new Book("Primeiro Projeto Utópico na História do Pensamento Humano",R.drawable.access));
}
}Code language: JavaScript (javascript)
Ao definir
android:orientation=”horizontal”
você pode fazê-lo organizar os itens na horizontal.


Otimizando o Desempenho do ListView
Nossa atividade atual recarrega a fonte de dados toda vez que é aberta, o que afeta a eficiência. Ao usar cache da View, podemos melhorar a velocidade.
Ao verificar o convertView, não precisamos obter a view toda vez.
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Book book = getItem(position); // [葡萄牙语] Obtém o livro atual
View view;
if (convertView==null)
{
view = LayoutInflater.from(getContext()).inflate(resource,parent,false);
}
else
{
view = convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.imageid);
imageView.setImageResource(book.getImageId());
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(book.getName());
return view;
}Code language: PHP (php)
Armazenar os Controles em Cache
Defina uma classe para manter o controle de imagem e o controle de texto
class ViewData
{
ImageView imageUI;
TextView textViewUI;
}Code language: JavaScript (javascript)
package com.foxdevelop.www.testlistview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class BookAdapter extends ArrayAdapter<Book> {
private int resource;
public BookAdapter(@NonNull Context context, int resource, @NonNull List<Book> objects) {
super(context, resource, objects);
this.resource = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Book book = getItem(position); // [葡萄牙语] Obtém o livro atual
View view;
ViewUI viewUI;
if (convertView==null)
{
view = LayoutInflater.from(getContext()).inflate(resource,parent,false);
ImageView imageView = (ImageView) view.findViewById(R.id.imageid); // [葡萄牙语] Precisamos obter o controle de imagem
TextView textView = (TextView) view.findViewById(R.id.name);
viewUI = new ViewUI();
viewUI.imageUI = imageView;
viewUI.textViewUI = textView;
view.setTag(viewUI);
}
else
{
view = convertView;
viewUI = (ViewUI)view.getTag();
}
viewUI.imageUI.setImageResource(book.getImageId());
viewUI.textViewUI.setText(book.getName());
return view;
}
class ViewUI
{
ImageView imageUI;
TextView textViewUI;
}
}Code language: JavaScript (javascript)
Eventos de Clique no ListView
Adicionar eventos de clique aos itens do listview.
Por exemplo, podemos exibir o nome do livro quando um item for clicado.
No onCreate da atividade principal

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadBooks();
BookAdapter adapter = new BookAdapter(MainActivity.this,R.layout.booklistview,courses); // [葡萄牙语] Carrega recursos da classe de entidade
final ListView listView = (ListView) findViewById(R.id.listview1);
listView.setAdapter(adapter);
// [葡萄牙语] Evento de clique
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { // [葡萄牙语] i é o número do índice do item atual
Book b =courses.get(i);
Toast.makeText(MainActivity.this,b.getName(),Toast.LENGTH_LONG).show();
}
});
}Code language: PHP (php)
Adicionar Bibliotecas de Dependência no build.gradle
A configuração ‘compile’ está obsoleta e foi substituída por ‘implementation’ e ‘api’.
Ela será removida no final de 2018. Para mais informações, consulte: http://d.android.com/r/tools/update-dependency-configurations.html
Precisamos adicionar suporte para a biblioteca de dependência
android.support.v7.widget.RecyclerView
.

<?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.support.v7.widget.RecyclerView
android:id="@+id/testrecy"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>Code language: HTML, XML (xml)
Uso do Controle de Rolagem RecyclerView – 1
O ListView é muito poderoso. Sua aplicação é muito ampla, e muitos aplicativos ainda o usam hoje.
No entanto, seu desempenho é um pouco inferior. A extensibilidade também não é forte.
Só permite a rolagem vertical dos dados. A rolagem horizontal é impossível.
O RecyclerView é uma versão aprimorada do ListView.
Ele pode alcançar os mesmos efeitos do ListView e ainda otimizou o ListView.
Também corrigiu suas deficiências.
O oficial recomenda usar o RecyclerView.
Uso Básico
Primeiro, adicione no gradle:
compile ‘com.android.support:recyclerview-v7:27.1.1’
Na seção anterior, adicionamos outro RecyclerView.
<android.support.v7.widget.RecyclerView
android:id="@+id/testrecy"
android:layout_width="match_parent"
android:layout_height="match_parent"/>Code language: HTML, XML (xml)
Continuaremos com o exemplo do livro.