[JAVA] Principes de base de RecyclerView

Environnement de vérification

Le contenu de cet article a été vérifié dans l'environnement suivant.

À propos de RecyclerView

Fonctionnalité

Vue d'ensemble

Liste des classes qui apparaissent dans RecyclerView

nom de la classe La description Où est-il dans ListView?
RecyclerView RecyclerView lui-même. Widget. Équivalent à ListView lui-même
RecyclerView.Adapter Généré en définissant une ligne de données dans une ligne de View Equivalent à l'adaptateur ListView
RecyclerView.ViewHolder Contient une ligne de référence de vue (widget) Dans ListView, la mise en page a été gonflée avec la méthode getItem. Dans RecyclerView, la vue de la disposition pour une ligne est conservée dans la sous-classe de ViewHolder.
RecyclerView.LayoutManager Une classe qui gère de manière réactive la mise en page en tenant compte de la taille d'un élément de données, etc. N'existe pas dans ListView.

RecyclerView vu sur la figure

La présentation la plus simple de RecyclerView est présentée ci-dessous. La grande différence avec ListView est que dans ListView, gonfler et obtenir les données du fichier de disposition dans la méthode getItem, Il est stocké dans View. Dans RecyclerView, chacun doit être défini comme un processus indépendant (méthode ou classe).

RecyclerView_001.png

L'application créée cette fois

J'ai créé une application très simple. Contenu qui n'affiche que l'image et le titre sur une seule ligne et des informations détaillées en dessous. Le but de cette fois n'est pas un affichage compliqué, mais pour comprendre la méthode de mise en œuvre de base de RecyclerView, j'en ai fait une application si simple.

SmallScreenshot_1493098981.png

la mise en oeuvre

Vous pouvez tirer le meilleur parti de l'achèvement des entrées en créant des enfants dans l'ordre suivant.

Ajouter une bibliothèque de support

Pour utiliser RecyclerView, vous devez ajouter une bibliothèque de support.

build.gradle


dependencies {
    compile 'com.android.support:recyclerview-v7:25.3.1'
}

Disposition pour une ligne

row.xml



<?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="wrap_content">


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="0.5"/>
            <TextView
                android:id="@+id/detail"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="0.5"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

Modèle de données pour une ligne

RowData.java


package jp.co.casareal.sample.recyclerviewsample.model;

/**
 * Created by naoi on 2017/04/25.
 */

public class RowData {
    private String title;
    private String detail;
・ ・ ・ Setter/getter omis ...
}

Définition de ViewHolder

L'adaptateur obtient une référence de vue à partir de la disposition de ligne gonflée et la conserve dans le champ public </ b>.

CasarealViewHolder.java


package jp.co.casareal.sample.recyclerviewsample.viewholder;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

import jp.co.casareal.sample.recyclerviewsample.R;

/**
 * Created by naoi on 2017/04/25.
 */

public class CasarealViewHolder extends RecyclerView.ViewHolder {
    public TextView titleView;
    public TextView detailView;
    public CasarealViewHolder(View itemView) {
        super(itemView);
        titleView = (TextView) itemView.findViewById(R.id.title);
        detailView = (TextView) itemView.findViewById(R.id.detail);

    }
}

Définition de l'adaptateur

CasarealRecycleViewAdapter.java


package jp.co.casareal.sample.recyclerviewsample.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

import jp.co.casareal.sample.recyclerviewsample.R;
import jp.co.casareal.sample.recyclerviewsample.model.RowData;
import jp.co.casareal.sample.recyclerviewsample.viewholder.CasarealViewHolder;

/**
 * Created by naoi on 2017/04/25.
 */

public class CasarealRecycleViewAdapter extends RecyclerView.Adapter<CasarealViewHolder> {

    private List<RowData> list;

    public CasarealRecycleViewAdapter(List<RowData> list) {
        this.list = list;
    }

    @Override
    public CasarealViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false);
        CasarealViewHolder vh = new CasarealViewHolder(inflate);
        return vh;
    }

    @Override
    public void onBindViewHolder(CasarealViewHolder holder, int position) {
        holder.titleView.setText(list.get(position).getTitle());
        holder.detailView.setText(list.get(position).getDetail());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

Description de chaque processus dans Adapter

.java


 @Override
    public CasarealViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false);
        CasarealViewHolder vh = new CasarealViewHolder(inflate);
        return vh;
    }

Correspond à ① et ② de "RecyclerView vu sur la figure".

.java


@Override
    public void onBindViewHolder(CasarealViewHolder holder, int position) {
        holder.titleView.setText(list.get(position).getTitle());
        holder.detailView.setText(list.get(position).getDetail());
    }

Correspond à ③ et ④ de "RecyclerView vu sur la figure".

.java


    @Override
    public int getItemCount() {
        return list.size();
    }

Cette méthode doit renvoyer le nombre total d'éléments à afficher.

De plus, l'ensemble de données à afficher par le constructeur, etc. est transmis.

Définition de l'activité

Fichier de mise en page global

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="jp.co.casareal.sample.recyclerviewsample.MainActivity">

<android.support.v7.widget.RecyclerView
    android:id="@+id/casarealRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</LinearLayout>

Comme avec ListView, vous devrez définir l'adaptateur ultérieurement, vous devez donc spécifier l'ID dans RecyclerView.

Traitement des activités

MainActivity.java


package jp.co.casareal.sample.recyclerviewsample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import jp.co.casareal.sample.recyclerviewsample.adapter.CasarealRecycleViewAdapter;
import jp.co.casareal.sample.recyclerviewsample.model.RowData;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView rv = (RecyclerView) findViewById(R.id.casarealRecyclerView);
        CasarealRecycleViewAdapter adapter = new CasarealRecycleViewAdapter(this.createDataset());

        LinearLayoutManager llm = new LinearLayoutManager(this);

        rv.setHasFixedSize(true);

        rv.setLayoutManager(llm);

        rv.setAdapter(adapter);
    }

    private List<RowData> createDataset() {

        List<RowData> dataset = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            RowData data = new RowData();
            data.setTitle("Casa Real Taro" + i + "problème");
            data.setDetail("Casa Real Taro" + i + "J'aime les morceaux frits");

            dataset.add(data);
        }
        return dataset;
    }
}

Description de chaque processus

.java


 LinearLayoutManager llm = new LinearLayoutManager(this);
 rv.setLayoutManager(llm);

L'une des fonctionnalités utiles que ListView n'a pas est le LayoutManager utilisé pour afficher les données de manière réactive. Cette fois, j'utilise LinerLayout, mais il y a aussi Grid et ainsi de suite.

.java


 rv.setHasFixedSize(true);

Si le nombre de données à afficher est de longueur fixe, il s'agit d'un paramètre qui utilise efficacement les ressources et améliore les performances.

.java


  CasarealRecycleViewAdapter adapter = new CasarealRecycleViewAdapter(this.createDataset());
  rv.setAdapter(adapter);

Réglez l'adaptateur.

.java


  private List<RowData> createDataset() {

        List<RowData> dataset = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            RowData data = new RowData();
            data.setTitle("Casa Real Taro" + i + "problème");
            data.setDetail("Casa Real Taro" + i + "J'aime les morceaux frits");

            dataset.add(data);
        }
        return dataset;
    }

L'ensemble de données à afficher est généré par la méthode createDataset.

Pour améliorer les fonctions

Il s'agit de la version Kotlin, mais si vous voulez savoir comment opérer par glisser-déposer ou glisser, veuillez vous référer à l'article suivant.

Suppression du déplacement et du glissement par glisser-déposer dans RecyclerView

référence

Créer des listes et des cartes https://developer.android.com/training/material/lists-cards.html?hl=ja#CardView

API https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

Recommended Posts

Principes de base de RecyclerView
Notions de base sur les rails
Bases de Ruby
Notions de base sur les fragments
Principes de base de JPA 1
Principes de base de Docker
Principes de base de ViewPager
Les bases de Java
Les bases de Java
Principes de base de JPA 2
Maintenant, j'ai résumé les bases de RecyclerView
Rails CSV Basic
Principes de base du routage des rails
Principes de base de la base de données Rails
Bases de Ruby
Principes de base de Java JAR
Notions de base orientées objet (Java)
bases de vim (gitbush)
Bases des expressions régulières
Principes de base du traitement parallèle Java
Principes de base de l'API Stream