Controle de lista ListView

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *